systemd 服务启动失败:依赖、权限与重启风暴排查

从 unit 状态、日志、依赖关系和安全限制定位 systemd 服务无法启动或反复重启的问题。

文章目录 · 4 节

服务启动失败时,不要只重复执行 systemctl restart。systemd 会记录退出码、触发条件和依赖关系,这些信息通常已经足够定位第一层原因。

读取完整状态

systemctl status my-service --no-pager -l
journalctl -u my-service -b --no-pager -n 200
systemctl show my-service -p Result,ExecMainStatus,NRestarts

退出码 203/EXEC 常见于文件不存在或不可执行,217/USER 表示用户配置异常。应用自身退出码则应回到应用日志和配置校验。

检查最终配置

systemctl cat my-service
systemctl list-dependencies my-service
systemd-analyze verify /etc/systemd/system/my-service.service

systemctl cat 会合并主 unit 和 drop-in,避免只看单个文件。修改后先执行 daemon-reload,再启动并观察。

权限与沙箱

确认运行用户能读取配置、写入数据目录并访问监听端口。ProtectSystemPrivateTmpNoNewPrivileges 等加固项也可能阻止旧程序运行,应逐项验证而不是整体关闭。

防止重启风暴

为自动重启配置合理的 RestartSecStartLimitBurst。服务依赖外部组件时,应用还应实现退避,避免同时放大下游故障。