You need to enable JavaScript to run this app. 如何通过系统原生工具实现开机运行的Python脚本异常退出自动重启
优惠活动
大模型
产品
解决方案
定价
更多

如何通过系统原生工具实现开机运行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 08:06:02