服务起不来时,先看状态、再查日志,最后修配置。systemd 是 Ubuntu 24.04 / Debian 12 的默认 init,排查顺序官方文档有明确推荐[1]。
先看服务状态
systemctl status <服务名>
关键看 Active: 字段。如果是 failed,记下退出码;如果是 inactive (dead),说明没启动成功或被停掉。用 failed 状态列全部失败单元,避免逐个翻[1]:
systemctl list-units --failed
查 journal 日志
journalctl -u <服务名> -n 50 --no-pager
-u 限定单元,-n 50 只看最近 50 行。如果是刚启动失败,加 -b 只读本次启动日志,减少噪音[2]。
检查 unit 配置
最常见的三种问题:ExecStart= 路径写错、Type= 与实际进程模型不符、权限用户不存在。先确认 unit 文件是否真的被加载:
systemctl cat <服务名>
然后对照官方 Type= 说明:simple 在 fork 后即认为已启动;如果进程会 fork 到后台,应使用 forking,否则 systemd 可能误判[1][3]。ExecStart= 必须是绝对路径,否则 unit 加载会报错[4]。
回滚与修复
改 unit 文件前先备份,改完重载并重启;失败后可重置状态:
cp /etc/systemd/system/<服务名>.service /root/<服务名>.service.bak
systemctl daemon-reload
systemctl restart <服务名>
systemctl reset-failed <服务名>
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
Active: failed,status=203/EXEC |
ExecStart 路径不存在 | which 确认二进制路径 |
Active: failed,status=226/NAMESPACE |
User= 不存在 | 检查 /etc/passwd |
Active: inactive (dead) |
没设置 WantedBy | 补 systemctl enable |
日志里有 Permission denied |
SELinux/AppArmor 或文件权限 | 查看 aa-status 或 audit.log |
code=exited, status=1/FAILURE |
程序自身异常退出 | 单独跑 ExecStart 命令复现 |
实测与局限性
- 实测环境:WSL2 Ubuntu 24.04,systemd 255.4。
- 已验证:
systemctl status/list-units --failed/journalctl -u/journalctl -b/daemon-reload/reset-failed。 - 局限性:WSL2 的 systemd 是用户态模拟,完整 systemd 行为(如真正的 cgroup 隔离)与物理机/云服务器不同;journal 在容器环境(Docker/Kubernetes)中可能被 stdout 驱动,不经过 systemd-journald。
参考资料
- [1] systemctl(1) – Linux manual page(sysctl)
- [2] journalctl(1) – Linux manual page(journal)
- [3] systemd.service — systemd manual pages(svc)
- [4] systemd.unit — systemd manual pages(unit)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。