如何通过系统原生工具实现开机运行的Python脚本异常退出自动重启
系统原生工具实现脚本异常自动重启的方案
完全可以依靠系统原生能力实现自动状态检测与重启,不需要自行编写ps、pgrep类的轮询判断逻辑,具体实现根据你之前用的部署方式分两类:
优先采用systemd实现(可靠性最高)
systemd通过cgroup直接追踪服务进程的全生命周期,内置完整的异常状态识别与自动拉起机制,不需要额外写检测代码:
- 你只需要在已有的.service配置文件中补充几个核心参数即可实现功能:
Restart=on-failure:只要进程以非0退出码、被信号终止、超时判定为异常退出,systemd会自动触发重启,不需要轮询检查进程是否存在RestartSec=5:异常退出后等待5秒再执行重启,避免故障场景下频繁拉起打满资源- 配套配置
StartLimitIntervalSec=60与StartLimitBurst=5:设定60秒内最多连续重启5次,超过阈值就终止重试,避免死循环重启 - 如果脚本存在僵死(主进程还在但实际无响应)的场景,还可以加
WatchdogSec=30参数:脚本每30秒需要向systemd上报一次运行心跳,超时没收到心跳就会被判定为异常,自动重启
- 配置完成后不需要修改原有脚本的日志逻辑,systemd会自动采集脚本的输出流,和你已有的日志写入功能完全兼容。
示例配置片段:
[Unit] Description=Python Business Script After=network.target [Service] Type=simple User=service_run_user WorkingDirectory=/your/script/path ExecStart=/usr/bin/python3 /your/script/path/main.py Restart=on-failure RestartSec=5 StartLimitIntervalSec=60 StartLimitBurst=5 WatchdogSec=30 [Install] WantedBy=multi-user.target
传统init.d场景下的实现方案
init.d框架本身没有内置的自动拉起能力,但可以借助系统源自带的原生工具实现,依然不需要自写进程检测逻辑:
- 可以使用系统自带的
start-stop-daemon工具配合脚本逻辑,通过文件锁关联进程状态,替代手动ps查询 - 更简便的是直接安装系统源内置的
daemon守护工具,配置时添加--respawn参数即可实现进程异常退出后自动拉起,工具本身会维护进程的运行状态追踪,可靠性优于自行编写轮询脚本。
注:init.d方案的追踪可靠性弱于systemd,存在状态误判的可能,能迁移到systemd部署的场景优先迁移。
内容的提问来源于stack exchange,提问作者Pavel Pervoy
相关产品推荐
相关产品推荐

