首页/系统/信创系统运维速查/Restart 重启策略与失败限速
服务与运维65 条

Restart 重启策略与失败限速

关键进程用 Restart=on-failure/always 配合 RestartSec 做崩溃自愈;systemd 对频繁重启有限速(StartLimitBurst/StartLimitIntervalSec),触发后单元停摆需修根因并复位。

信创系统运维速查系统更新于 2026-10-13

重启策略是什么

systemd 可以为服务配置自动重启:Restart=on-failure 表示非正常退出时拉起,always 表示无论如何都拉起,RestartSec 控制重启间隔。为防止某个单元无限快速重启拖垮系统,systemd 还提供失败限速(StartLimitIntervalSec 与 StartLimitBurst),触发后单元进入 failed 状态不再自动重试。

基本信息

重启策略Restart=on-failure / always / no
重启间隔RestartSec
失败限速[Unit] 段 StartLimitIntervalSec 与 StartLimitBurst
查看次数systemctl show <服务> -p NRestarts
复位systemctl reset-failed <服务>

典型使用场景

  • 关键业务进程崩溃后自动恢复,减少人工介入
  • 偶发依赖未就绪导致启动失败时自动重试
  • 避免频繁重启刷屏:用失败限速把异常暴露出来
  • 排障时确认服务到底重启了多少次
  • 给脚本类服务加防重入保护后再启用自动重启

单元配置示例

单元配置示例
[Unit]
StartLimitIntervalSec=60     # 限速统计窗口
StartLimitBurst=5            # 窗口内超过 5 次启动失败即停止重试

[Service]
Restart=on-failure           # 非正常退出时拉起
RestartSec=3                 # 每次重启前等待 3 秒

观察与复位

观察与复位
systemctl show myapp -p NRestarts          # 看已重启次数
systemctl show myapp -p Restart -p RestartSec
systemctl status myapp --no-pager | head -12
journalctl -u myapp -n 50 --no-pager       # 结合日志看崩溃原因
systemctl reset-failed myapp && systemctl start myapp   # 修完根因后复位再启动

策略值对照

取值含义适用场景
no从不自动重启一次性任务或不允许重试的服务
on-failure非零退出或被杀死时重启多数常驻服务
always包括正常退出在内都重启必须常驻的守护进程
on-abnormal仅信号或超时导致退出时重启希望正常退出不再拉起
自动重启的脚本类服务要有防重入保护(如 flock 或 pid 文件),否则崩溃与重启循环会不断重复执行,放大故障影响。

配置前确认

  • 明确服务正常退出时的期望行为,再决定策略取值
  • 确认重启不会触发外部重复动作,如重复投递任务
  • 给脚本类服务加锁,避免并发执行
  • 设置合理的重启间隔与限速阈值
  • 配置后人为制造一次失败,验证自愈与限速都生效

易错点

  • 把 StartLimit 参数写在 [Service] 段:现代 systemd 中这两个键属于 [Unit] 段,写错位置不生效
  • 限速触发后只看停止自动重启就收工:本质是持续崩溃,先看 NRestarts 与 journal 定位根因再复位
  • 对一次性的迁移或清理任务设置 always:任务正常结束后会被反复拉起,造成重复执行
  • RestartSec 设得过短:依赖外部资源未就绪时会连续失败并迅速触发限速,适当加大等待更稳
  • 只看自动重启生效不做监控:重启次数与原因要纳入告警,否则故障被重启掩盖到彻底起不来才暴露

数据来源与参考

  • man 5 systemd.service(Restart)
  • man 5 systemd.unit(StartLimit)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌