对长驻服务来说,自动重启很有用,但无界的循环会把一个清晰的失败变成一个嘈杂的失败。单元文件应同时描述正常进程生命周期与可接受的恢复量。
捕获启动失败
对长驻进程,Type=exec 能在启动时暴露配置程序执行失败,而不是把一次 fork 当成功。把它与显式的 ExecStart 以及能完成工作所需最小权限的 User 搭配使用。
[Service]
Type=exec
User=site
ExecStart=/srv/site/bin/server
Restart=on-failure
RestartSec=5s
Restart=on-failure 是一种恢复策略,不是健康检查。如果进程在提供错误响应的同时保持存活,systemd 不会知道站点坏了;外部冒烟测试仍有其职责。
限制循环
Systemd 通过 StartLimitIntervalSec= 与 StartLimitBurst= 应用启动速率限制。选择允许短暂瞬时停机、但不会让崩溃循环耗尽主机资源的值。当达到限制时,日志里应包含区分"重启成功"与"重复失败后放弃"所需的证据。
修改单元后,核验已加载配置并检查最近日志:
systemctl daemon-reload
systemctl restart example.service
systemctl status --no-pager example.service
journalctl -u example.service -n 80 --no-pager
不要用重启策略掩盖缺失文件、无效权限或糟糕的环境。先修复第一次失败,再测试恢复路径。
来源
- systemd.service,服务类型、重启与启动速率限制器,已核验 2026-08-22。
- systemd.unit,通用单元段与 drop-in 语义,已核验 2026-08-22。