systemd watchdog如何检测冻结应用并实现自动重启?
Systemd Watchdog 对应用冻结状态的检测与重启机制
systemd 的 watchdog 机制核心依赖应用主动发送心跳信号来维持与 systemd 的健康交互,你看到的示例没包含心跳逻辑,大概率是默认省略了这部分关键实现。
当应用处于未崩溃但冻结的状态时,systemd 是通过以下逻辑感知并触发重启的:
- 首先需要在服务配置文件(
.service)中开启 watchdog:- 添加
WatchdogSec=<超时时间>(比如WatchdogSec=30s),定义 systemd 等待心跳的最长间隔 - 配置
Restart=<重启策略>(比如Restart=on-failure),让 systemd 在检测到异常时自动重启应用
- 添加
- 应用必须主动实现心跳上报逻辑:
- 通过 libsystemd 库调用
sd_notify(0, "WATCHDOG=1")发送心跳 - 或者直接向环境变量
NOTIFY_SOCKET指定的 Unix 域套接字发送字符串"WATCHDOG=1"
- 通过 libsystemd 库调用
- 当应用冻结后,会停止发送心跳,systemd 在
WatchdogSec时间内未收到新的心跳信号,就会判定应用处于异常状态,随后按照配置的重启策略重启应用。
需要注意的是,如果应用完全没实现心跳上报,systemd 的 watchdog 机制不会生效——它本质是一种"合作式"监控,依赖应用自身的健康状态上报。
内容的提问来源于stack exchange,提问作者czrty
相关产品推荐
相关产品推荐

