服务启动失败时,不要只重复执行 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,再启动并观察。
权限与沙箱
确认运行用户能读取配置、写入数据目录并访问监听端口。ProtectSystem、PrivateTmp、NoNewPrivileges 等加固项也可能阻止旧程序运行,应逐项验证而不是整体关闭。
防止重启风暴
为自动重启配置合理的 RestartSec 和 StartLimitBurst。服务依赖外部组件时,应用还应实现退避,避免同时放大下游故障。