Linux服务崩溃自动重启_systemd配置

5次阅读

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

Linux服务崩溃自动重启_systemd配置

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)”
text=ZqhQzanResources