Systemd服务重启策略详解:on-failure与相关配置
Systemd服务重启策略详解:on-failure与相关配置
Systemd作为现代Linux系统的初始化系统和服务管理器,提供了强大的服务监控和自动重启功能。本文将重点介绍Restart=on-failure
策略及其相关配置项的使用方法。
Restart=on-failure 策略解析
Restart=on-failure
是Systemd服务单元文件中常用的重启策略,它定义了服务在何种情况下会被自动重启:
Restart=on-failure
工作特点
- 仅在非正常退出时重启:当服务以非零退出码(表示失败)终止时,Systemd会自动重启该服务
- 不重启主动停止的服务:如果服务是被
systemctl stop
命令正常停止的,Systemd不会自动重启它 - 适用于关键服务:这种策略适合那些需要持续运行但对资源敏感的服务
与其他重启策略对比
策略 | 描述 |
---|---|
always | 无论服务如何退出都会重启 |
on-success | 仅在服务成功退出时重启(退出码为0) |
on-failure | 仅在服务失败退出时重启(退出码非0) |
on-abnormal | 因信号终止或超时退出时重启 |
on-abort | 仅在收到未捕获的异常信号时重启 |
on-watchdog | 仅在看门狗超时时重启 |
相关配置参数
RestartSec - 重启间隔
RestartSec=120
- 指定服务失败后等待多少秒再尝试重启
- 上例设置为120秒(2分钟),避免频繁重启消耗资源
- 对于数据库等需要时间恢复的服务,建议设置较长间隔
StartLimitBurst - 最大尝试次数
StartLimitBurst=2
- 定义在StartLimitInterval时间段内允许的启动尝试次数
- 上例设置为2次(初始运行+1次重试)
- 超过限制后,Systemd将不再尝试重启服务
StartLimitInterval - 时间窗口
StartLimitInterval=300
- 定义StartLimitBurst计数的时间窗口(单位:秒)
- 默认值为10秒
- 与StartLimitBurst配合使用,防止服务进入"重启循环"
完整配置示例
[Unit]
Description=My Critical Service[Service]
ExecStart=/usr/local/bin/my-service
Restart=on-failure
RestartSec=120
StartLimitBurst=2
StartLimitInterval=300[Install]
WantedBy=multi-user.target
实际应用建议
-
关键服务:对于必须持续运行的服务(如数据库、消息队列),建议使用
Restart=always
-
资源敏感服务:对于可能因资源不足偶尔失败的服务,使用
on-failure
配合适当的RestartSec
-
调试阶段:在服务开发调试期间,可以暂时禁用自动重启,以便查看失败原因
-
监控日志:即使配置了自动重启,也应监控服务日志,找出频繁重启的根本原因
管理命令
- 查看服务状态:
systemctl status service-name
- 手动重启服务:
systemctl restart service-name
- 停止服务:
systemctl stop service-name
- 禁用自动重启:
systemctl edit service-name
然后设置Restart=no