systemd 服务启动失败,先看这三处再重启
服务起不来,第一反应往往是 systemctl restart xxx 再试一次。但重启之前先看三处,多数情况下一次就能定位问题,盲目重启只会把日志冲掉、把现场弄丢。
第一处:systemctl status 的最后几行。不要只看 Active: failed 这一行,往下拉看日志尾巴和 Process: 行的退出码。退出码 203 是 ExecStart 里的命令找不到或没执行权限,203 先查路径和权限;退出码 1 通常是程序自己退出的,要去看程序日志;Result: exit-code 后面如果跟着 code=exited,说明进程确实跑起来过又退了,问题在程序配置而非 systemd 本身。
第二处:journalctl -u xxx --since "10 minutes ago"。systemctl status 只给最后十几行,完整的启动报错都在 journal 里。常见三类:端口被占(Address already in use)——先 ss -ltnp 找到占端口的进程,而不是改端口绕过去;配置文件语法错——很多服务启动前不校验配置,报错直接写在 journal 里,按行号改;依赖的目录或文件不存在——比如日志目录没建,服务一写日志就退出,mkdir -p 加上对应属主就能解决。
第三处:unit 文件本身。systemctl cat xxx 看一眼实际生效的配置,重点看三行:User= 是不是写错了用户(用户不存在会直接 217 退出);WorkingDirectory= 指向的目录存不存在;EnvironmentFile= 引用的文件在不在。改过 unit 文件后别忘了 systemctl daemon-reload,否则改了也白改——这是最常见的"我明明改了怎么没用"。
排查顺序总结:systemctl status 看退出码定方向 → journalctl -u 看完整报错找根因 → systemctl cat 核对 unit 配置有没有写错。修完先 systemctl start 试一次,确认能起来再 enable,别把没验证过的配置直接设成开机自启。
- 点赞
- 收藏
- 关注作者
评论(0)