Restart=on-failure是systemd服务单元中用于在服务以非零退出码、被信号终止、超时或看门狗触发时自动重启的策略,但不会在手动停止时重启,需配合RestartSec、StartLimitBurst等参数防止雪崩。

Linux 中为 systemd 服务配置自动重启,核心是通过 .service 文件中的 [Service] 段设置 Restart= 及配套参数。这不是“开启开关”,而是根据服务类型和容错需求,选择合适的重启策略并配合超时、间隔等细节。
明确 Restart 策略的含义与适用场景
systemd 的 Restart= 不是简单“失败就重试”,它会结合进程退出码、信号、以及服务类型(Type)共同判断是否触发重启。常见选项有:
-
no:从不重启(默认值) -
on-failure:进程以非零退出码、被信号终止(如 SIGKILL)、或触发 core dump 时重启 -
on-abnormal:仅在被信号杀死或 core dump 时重启(忽略非零退出码) -
on-watchdog:仅当看门狗超时触发时重启 -
always:无论退出码或原因,只要进程停止就重启(适合守护型长期服务)
⚠️ 注意:
Type=forking服务(如 Nginx、MySQL)必须配合PIDFile=使用,否则 systemd 无法准确追踪主进程,Restart可能失效;而Type=simple(默认)则以ExecStart启动的进程为主进程,更直观可靠。
必须搭配的关键参数
单设 Restart= 不够,还需以下参数协同工作:
-
RestartSec=:重启前等待秒数(如RestartSec=3s),避免高频崩溃导致系统卡顿 -
StartLimitIntervalSec=和StartLimitBurst=:限制单位时间内的最大启动次数(例如StartLimitIntervalSec=60+StartLimitBurst=5表示 60 秒内最多尝试 5 次),防止无限循环重启 -
RestartPreventExitStatus=:指定某些退出码 不触发 重启(如 Java 应用正常关闭返回 143,可写RestartPreventExitStatus=143)
实际配置示例(Java 服务)
[Service] ExecStart=/usr/bin/java -jar /opt/app.jar Restart=always RestartSec=10 StartLimitIntervalSec=60 StartLimitBurst=3 RestartPreventExitStatus=143 User=appuser
这段配置表示:服务崩溃后等 10 秒再拉起;每分钟最多重启 3 次;若因 SIGTERM(退出码 143)结束,则不重启——既保障可用性,又避免误判正常关闭。
验证与调试方法
- 手动模拟崩溃:
sudo systemctl kill -s SIGKILL myapp.service,观察是否按预期重启 - 查看重启记录:
sudo journalctl -u myapp.service --since "1 hour ago" | grep -i "restart\|started" - 检查限制状态:
sudo systemctl show myapp.service | grep -E "(StartLimit|Restart)"
重启行为由 systemd 全局策略和单元配置共同决定,合理设置才能兼顾稳定性与自愈能力。











