重启策略是什么
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 文件),否则崩溃与重启循环会不断重复执行,放大故障影响。
配置前确认
- 明确服务正常退出时的期望行为,再决定策略取值
- 确认重启不会触发外部重复动作,如重复投递任务
- 给脚本类服务加锁,避免并发执行
- 设置合理的重启间隔与限速阈值
- 配置后人为制造一次失败,验证自愈与限速都生效