You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下实现Python脚本服务停滞时自动重启

解决Python服务停滞无响应的自动重启问题

针对你遇到的脚本无报错但停滞(如下载卡住)的场景,以下是几种可行的实现方案:

方案一:自定义监测脚本 + Cron定时任务

通过定时检查脚本日志文件的最后修改时间,判断是否停滞并触发重启:

  1. 配置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
  1. 编写监测脚本
    创建/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
  1. 配置Cron定时运行
    编辑Cron任务:
crontab -e

添加一行,让脚本每分钟运行一次:

* * * * * /usr/local/bin/check_script_stuck.sh

方案二:使用Monit专业监控工具

Monit是轻量级系统监控工具,支持文件修改时间监测,配置更简洁:

  1. 安装Monit
sudo apt update && sudo apt install monit
  1. 配置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功能,直接监测脚本的存活状态,无需依赖日志:

  1. 修改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
  1. 修改Systemd服务配置
    在服务文件的[Service]段添加:
WatchdogSec=300  # 5分钟超时
Restart=always
Type=notify

重新加载并重启服务:

sudo systemctl daemon-reload
sudo systemctl restart your_script.service

内容的提问来源于stack exchange,提问作者NedStarkOfWinterfell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:38:14