首页/系统/Linux 运维命令速查/场景:服务起不来七步排查法
systemd 与服务42 条

场景:服务起不来七步排查法

服务 systemctl start 失败:从语法、环境、权限、端口、依赖到资源逐层排除,标准动作一次跑完定位根因。

Linux 运维命令速查系统更新于 2026-10-12
场景服务启动失败/立即退出
目标定位失败层并修复
工具链status → journalctl → verify → 手动复现

第 1 步:状态与退出码

第 1 步:状态与退出码
systemctl status myapp --no-pager -l
systemctl show myapp -p ExecMainStatus,Result,NRestarts

第 2 步:完整日志

第 2 步:完整日志
journalctl -u myapp -n 200 --no-pager

第 3 步:单元语法与依赖

第 3 步:单元语法与依赖
systemd-analyze verify /etc/systemd/system/myapp.service
systemctl list-dependencies myapp | head

第 4 步:手动复现同环境

第 4 步:手动复现同环境
sudo -u appuser env -i PATH=/usr/bin:/bin /opt/myapp/bin/start --config /etc/myapp/app.conf; echo "exit=$?"

第 5 步:权限与路径

第 5 步:权限与路径
namei -l /opt/myapp/bin/start
ls -ld /opt/myapp /etc/myapp

第 6 步:端口冲突

第 6 步:端口冲突
ss -lntp | grep -E '(:8080|java|node)'

第 7 步:资源限制

第 7 步:资源限制
journalctl -u myapp | grep -iE 'oom|limit|denied|permission' | tail
七步的核心是「让 systemd 的运行环境在手边复现」:多数失败在路径、用户权限或环境变量三处。

易错点

  • sudo -u appuser 与 systemd 的 User= 仍有环境差异(HOME、PATH、继承的子进程组),复杂场景用 systemd-run 精确复现
  • 端口被占(Address already in use)在应用日志常见但根因可能是上一个实例没退干净,查 ps/ss 双证

数据来源与参考

  • man 5 systemd.service
  • man 1 systemd-analyze(verify)
  • systemd 官方 Troubleshooting 文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌