linux中为systemd服务配置失败后延迟重试,需在[service]段设置restart=on-failure、restartsec=8、startlimitintervalsec=120和startlimitburst=3,并执行daemon-reload与restart生效。

Linux 系统中为 systemd 服务配置失败后延迟重试,核心是用好 RestartSec 配合 Restart 和启动频率限制参数,让服务在崩溃或异常退出后,等待指定时间再拉起,避免高频闪退、资源争抢或依赖未就绪引发的连锁失败。
关键配置项必须写在 .service 文件的 [Service] 段内
-
Restart=on-failure:只在非零退出码、被信号终止(如 SIGSEGV)、超时或 OOM kill 时重启,最贴近“故障恢复”本意 -
RestartSec=8:每次重启前强制等待 8 秒(单位支持秒和毫秒,如500ms),这是实现“延迟”的直接手段 -
StartLimitIntervalSec=120:统计窗口设为 120 秒 -
StartLimitBurst=3:该窗口内最多允许重启 3 次,超限后 systemd 将停止尝试并标记为start-limit-hit
示例片段:
[Service] Type=simple ExecStart=/usr/local/bin/myapp Restart=on-failure RestartSec=8 StartLimitIntervalSec=120 StartLimitBurst=3
配置生效前必须执行
-
sudo systemctl daemon-reload:重载所有 unit 文件,使新配置生效 -
sudo systemctl restart myapp.service:重启服务应用策略
验证是否生效
-
journalctl -u myapp -n 30 -f:观察日志中Started和Starting时间戳间隔是否稳定接近RestartSec值 -
systemctl show myapp | grep -E "(Restart|StartLimit)":确认当前生效的参数值
常见误区提醒
- 不要设
Restart=always+RestartSec=0:看似“立即重启”,实则可能触发默认 100ms 间隔,加上StartLimitBurst限制,反而更快被限流 - 不要在
ExecStartPre中加sleep模拟延迟:它只在启动前执行一次,无法控制崩溃后的重启节奏 -
Type=forking服务需额外确保主进程 PID 正确,否则 systemd 可能误判“已退出”,导致RestartSec不触发
基本上就这些。











