对长驻服务来说,自动重启很有用,但无界的循环会把一个清晰的失败变成一个嘈杂的失败。单元文件应同时描述正常进程生命周期与可接受的恢复量。
捕获启动失败
对长驻进程,Type=exec 能在启动时暴露配置程序执行失败,而不是把一次 fork 当成功。把它与显式的 ExecStart 以及能完成工作所需最小权限的 User 搭配使用。
[Unit]
Description=Example foreground site service
StartLimitIntervalSec=60s
StartLimitBurst=5
[Service]
Type=exec
User=site
ExecStart=/srv/site/bin/server
Restart=on-failure
RestartSec=5s
Type=exec 确认程序已执行,并不确认应用已就绪。程序应保持前台运行;应用支持显式就绪通知时可用 Type=notify。Restart=on-failure 是恢复策略,不是健康检查。如果进程在提供错误响应的同时保持存活,systemd 不会知道站点坏了;外部冒烟测试仍有其职责。
限制循环
Systemd 通过 StartLimitIntervalSec= 与 StartLimitBurst= 应用启动速率限制。这两个指令放在 [Unit],RestartSec 放在 [Service]。示例允许 60 秒内启动五次;快速失败之间只有五秒重启延迟,因此可能达到限制。更长延迟可能让循环一直低于该速率:这并不是整个生命周期的重试次数预算。应按预期故障模式选择限制。当达到限制时,日志里应包含区分"重启成功"与"重复失败后放弃"所需的证据。
在获准使用的测试主机上安装或修改单元后,先验证文件、重载管理器并检查有效配置,再重启。下列命令会改变服务状态,可能中断流量:
systemd-analyze verify /etc/systemd/system/example.service
systemctl daemon-reload
systemctl cat example.service
systemctl show example.service -p Restart -p RestartUSec \
-p StartLimitIntervalUSec -p StartLimitBurst
systemctl restart example.service
systemctl status --no-pager example.service
journalctl -u example.service -n 80 --no-pager
不要用重启策略掩盖缺失文件、无效权限或糟糕的环境。先修复第一次失败,再测试恢复路径。
启动限制停止自动重启后,单纯等到间隔结束不会自动排定下一次尝试。修复原因后,可等待间隔结束再启动,或有意识地用 systemctl reset-failed example.service 清除计数器后启动。在隔离服务中测试可执行文件缺失与快速崩溃,并保存第一次失败日志,不要只留下最后的“达到启动限制”消息。
来源
- systemd.service,服务类型、重启与启动速率限制器,已核验 2026-08-03。
- systemd.unit,通用单元段与 drop-in 语义,已核验 2026-08-03。
- systemd.service upstream manual (v257),Type=exec/oneshot、就绪、激活超时与重启语义,已核验 2026-10-15。
- systemd.unit upstream manual (v257),启动限制所属配置段、速率窗口与 reset-failed 行为,已核验 2026-10-15。