linux服务崩溃后自动重启需配置systemd的restart策略:设restart=on-failure(推荐)、restartsec=5、startlimitintervalsec=60、startlimitburst=3,并匹配type=类型,最后重载并验证。

Linux服务崩溃后自动重启,关键在于正确配置 systemd 的重启策略。systemd 本身支持多种重启行为,不需要额外脚本或守护进程,只要在 service 文件中设置合适的选项即可生效。
启用 Restart= 重启策略
在服务单元文件(如 /etc/systemd/system/myapp.service)的 [Service] 段中,添加 Restart= 参数指定触发重启的条件:
- Restart=always:无论退出码或信号如何,只要进程终止就重启(慎用,可能掩盖问题)
- Restart=on-failure:仅当进程异常退出(退出码非 0、被信号终止、超时等)时重启(推荐默认选择)
- Restart=on-abnormal:仅因信号或超时终止时重启(不包括正常退出码非 0 的情况)
- Restart=on-watchdog:仅由看门狗超时触发时重启(需配合 WatchdogSec=)
配合 RestartSec 和 StartLimit* 防止频繁重启
单纯启用 Restart= 可能导致服务反复崩溃又立即重启,消耗系统资源。应搭配以下参数控制重启节奏:
- RestartSec=5:每次重启前等待 5 秒(避免瞬时循环)
- StartLimitIntervalSec=60:统计重启次数的时间窗口(默认 10 秒,建议设为 60 秒更合理)
- StartLimitBurst=3:该时间窗口内最多允许重启 3 次,超出则暂停启动
- 若需彻底禁用启动限制,可设 StartLimitBurst=0(不推荐生产环境)
确保服务类型匹配 Restart 行为
Restart 策略是否生效,还取决于 Type= 设置:
- Type=simple(默认):systemd 在启动主进程后即认为服务已就绪,后续崩溃可被检测并触发 Restart
- Type=forking:适用于传统 daemon,需正确设置 PIDFile=,否则 systemd 可能无法追踪主进程状态
- Type=notify:服务启动后通过 sd_notify() 主动通知 systemd 就绪,适合需要初始化完成才可重启的场景
- Type=oneshot:执行完即退出,Restart= 通常无效(除非显式设为 always)
验证与调试方法
修改 service 文件后必须重载配置,并检查实际行为是否符合预期:
- sudo systemctl daemon-reload:重新加载 unit 文件
- sudo systemctl restart myapp.service:测试重启流程
- sudo systemctl status myapp.service:查看当前状态、最近退出原因、重启计数
- sudo journalctl -u myapp.service -n 50 -f:实时跟踪日志,确认崩溃原因和重启时机
- 检查重启次数:sudo systemctl show myapp.service | grep -E "(Restarts|StartLimit)"










