Linux下实现Python脚本服务停滞时自动重启
解决Python服务停滞无响应的自动重启问题
针对你遇到的脚本无报错但停滞(如下载卡住)的场景,以下是几种可行的实现方案:
方案一:自定义监测脚本 + Cron定时任务
通过定时检查脚本日志文件的最后修改时间,判断是否停滞并触发重启:
- 配置systemd服务输出到日志文件
修改你的systemd服务文件(例如/etc/systemd/system/your_script.service),确保输出重定向到固定日志:
[Unit] Description=Your Python Script Service After=network.target [Service] User=your_username ExecStart=/usr/bin/python3 /path/to/your_script.py StandardOutput=append:/var/log/your_script.log StandardError=append:/var/log/your_script_error.log Restart=on-failure # 保留原有报错重启逻辑 [Install] WantedBy=multi-user.target
更新配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart your_script.service
- 编写监测脚本
创建/usr/local/bin/check_script_stuck.sh,内容如下:
#!/bin/bash LOG_FILE="/var/log/your_script.log" STUCK_THRESHOLD=300 # 5分钟,单位秒 # 检查日志文件是否存在 if [ ! -f "$LOG_FILE" ]; then echo "Log file not found" exit 1 fi # 获取日志最后修改时间的时间戳 LAST_MODIFIED=$(stat -c %Y "$LOG_FILE") CURRENT_TIME=$(date +%s) TIME_DIFF=$((CURRENT_TIME - LAST_MODIFIED)) # 如果超过阈值,重启服务 if [ "$TIME_DIFF" -gt "$STUCK_THRESHOLD" ]; then sudo systemctl restart your_script.service echo "$(date): Script stuck, restarted service" >> /var/log/script_monitor.log fi
给脚本添加执行权限:
sudo chmod +x /usr/local/bin/check_script_stuck.sh
- 配置Cron定时运行
编辑Cron任务:
crontab -e
添加一行,让脚本每分钟运行一次:
* * * * * /usr/local/bin/check_script_stuck.sh
方案二:使用Monit专业监控工具
Monit是轻量级系统监控工具,支持文件修改时间监测,配置更简洁:
- 安装Monit
sudo apt update && sudo apt install monit
- 配置Monit监控规则
编辑/etc/monit/conf.d/your_script.conf:
check process your_script with pidfile /run/your_script.pid start program = "/usr/bin/systemctl start your_script.service" stop program = "/usr/bin/systemctl stop your_script.service" if file /var/log/your_script.log modified < 5 minutes then restart
注意:需要让你的systemd服务生成PID文件,在服务文件的[Service]段添加:
PIDFile=/run/your_script.pid
重新加载systemd和monit:
sudo systemctl daemon-reload sudo systemctl restart your_script.service sudo systemctl restart monit
方案三:脚本内置心跳 + Systemd Watchdog
如果可以修改Python脚本,推荐用Systemd的Watchdog功能,直接监测脚本的存活状态,无需依赖日志:
- 修改Python脚本添加心跳
使用systemd.daemon模块发送心跳信号:
import time from systemd import daemon # 初始化watchdog daemon.notify("WATCHDOG=1") while True: # 你的脚本业务逻辑 # ... # 每隔2分钟发送一次心跳(需小于WatchdogSec设置的值) daemon.notify("WATCHDOG=1") time.sleep(120)
如果没有systemd-python模块,先安装:
pip install systemd-python
- 修改Systemd服务配置
在服务文件的[Service]段添加:
WatchdogSec=300 # 5分钟超时 Restart=always Type=notify
重新加载并重启服务:
sudo systemctl daemon-reload sudo systemctl restart your_script.service
内容的提问来源于stack exchange,提问作者NedStarkOfWinterfell
相关产品推荐
相关产品推荐

