systemd服务崩溃自动恢复的核心是通过service段配置重启策略、频率限制和健康检查。restart=on-failure等策略控制触发条件,restartsec与startlimitburst等防熔断,memorymax、watchdogsec等提升可靠性,需经daemon-reload、enable--now、journalctl跟踪及sigsegv模拟验证。
服务崩溃后自动恢复,核心是让 systemd 主动接管重启逻辑,而不是靠外部脚本轮询或手动干预。配置重点在 service 文件的 [service] 区段,合理设置重启策略、间隔、限制和健康反馈。
设置基础重启策略
Restart 参数决定什么情况下触发重启:
- Restart=on-failure:进程非零退出码、被信号终止(如 SIGSEGV)、超时退出时重启;跳过正常 exit 0 的情况,适合多数守护进程
- Restart=always:无论退出码如何都重启,适用于希望“永驻”的简单脚本(如 Python 后台任务)
- Restart=on-abnormal:仅响应非正常终止(不含 exit 0,也不含 RestartForceExitStatus 指定的码),比 on-failure 更严格
- Restart=watchdog:配合服务内 watchdog 机制使用,要求服务主动发送 WATCHDOG=1 心跳,超时即重启
控制重启节奏与熔断
避免高频崩溃导致系统资源耗尽或日志刷屏,需限制重启频率:
- RestartSec=5:每次重启前等待 5 秒,给磁盘/网络缓冲时间
- StartLimitIntervalSec=60:定义“窗口期”为 60 秒
- StartLimitBurst=3:该窗口期内最多允许 3 次启动尝试
- 超出限制后,systemd 将暂停启动并标记为 failed,需人工介入(
systemctl reset-failed myapp.service)
增强可靠性:资源约束与健康检查
systemd 默认只看进程是否存活,对卡死、内存溢出、无响应等不敏感,需额外加固:
- MemoryMax=512M 和 CPUQuota=80%:限制资源使用,防止拖垮整机
- OOMScoreAdjust=-500:大幅降低被内核 OOM Killer 杀掉的概率
- ExecStartPre=/usr/bin/curl -f http://localhost:8000/health || exit 1:启动前做 HTTP 健康探针,失败则不启动新实例
-
WatchdogSec=30 + Restart=watchdog:要求服务每 30 秒内调用
systemd-notify --watchdog=1,否则视为失联重启
验证与调试关键操作
配置完不能直接上线,必须验证行为是否符合预期:
- 重载配置:
sudo systemctl daemon-reload - 启用并启动:
sudo systemctl enable --now myapp.service - 实时跟踪日志:
journalctl -u myapp.service -n 50 -f,观察崩溃原因和重启动作 - 模拟崩溃测试:
sudo systemctl kill -s SIGSEGV myapp.service,确认是否按 Restart 策略响应 - 临时禁用重启调试:
sudo systemctl set-property myapp.service Restart=no,再手动 start 观察原始启动流程











