systemctl start 刚执行完就进了 failed,status 里只有 Main PID exited code 1 status=1/FAILURE,看不到任何业务日志,手工敲同一条命令却正常,很难判断是配置还是代码,排起来很容易绕圈。日志里能对上时间点,这种反而好排。

服务类型写成 simple 时进程一退出只会留下退出码,标准输出被 journald 收走,工作目录和环境变量又和手工执行不同,单看 status 拿不到任何线索。这一点先确认清楚,后面就不用反复试。

systemctl status app.service -l --no-pager
journalctl -u app.service -n 120 --no-pager -o cat
systemd-analyze verify /etc/systemd/system/app.service
grep ExecStart /etc/systemd/system/app.service

「systemd 服务启动失败」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:按服务名看 journalctl 里启动前后一百行输出 从第一行报错读起;核对 unit 里的工作目录 运行用户和环境变量 这三处最常出问题;用 systemd-analyze verify 检查语法和依赖顺序 顺带看 unit 有没有写错路径。

结果对不对很好判断,journalctl 里能看到业务自己的报错 status 变成 active 并保持 running 等三分钟确认没退出。

作者 9823189