Linux检测screen中Python脚本运行状态 未运行则自动启动
AWS Linux环境screen托管Python脚本自动重启监控方案
提供两种实现,优先选择Shell脚本,无额外依赖、资源占用极低。
方案1:Shell监控脚本(推荐)
使用步骤
- 将下面的脚本内容保存为
monitor.sh,建议和目标脚本script.py放在同一目录;如果存放路径不同,修改脚本里PY_SCRIPT_PATH的值为script.py的绝对路径(比如/home/ec2-user/my_project/script.py),避免路径找不到的问题。 - 给脚本添加执行权限,执行命令:
chmod +x monitor.sh - 启动监控脚本,建议也放在screen后台运行:执行
screen -S monitor_worker ./monitor.sh,之后按Ctrl+A再按D即可detach会话,监控会一直在后台运行。
脚本内容
#!/bin/bash # 可自行修改配置 SCREEN_NAME="py_script_worker" PY_SCRIPT_PATH="./script.py" CHECK_INTERVAL=5 while true; do # 同时检测screen会话存在、目标Python进程存活 if screen -ls | grep -q "$SCREEN_NAME" && pgrep -f "python3 $PY_SCRIPT_PATH" > /dev/null; then sleep $CHECK_INTERVAL else # 清理残留的异常退出同名screen会话 screen -S "$SCREEN_NAME" -X quit > /dev/null 2>&1 # 新建后台detached模式的screen会话,启动目标Python脚本 screen -dmS "$SCREEN_NAME" python3 $PY_SCRIPT_PATH sleep $CHECK_INTERVAL fi done
常用操作
- 要查看脚本运行输出:执行
screen -r py_script_worker即可进入对应会话 - 看完退出会话不要按
Ctrl+C(会终止脚本),按Ctrl+A再按D即可detach回到原终端
方案2:Python监控脚本
如果更熟悉Python语法,可使用以下实现,逻辑和Shell版本完全一致。
使用步骤
- 将脚本保存为
monitor_py.py,同样修改PY_SCRIPT_PATH为目标脚本的实际路径 - 启动脚本:
python3 monitor_py.py,建议同样放在screen后台托管运行
脚本内容
import time import subprocess # 可自行修改配置 SCREEN_NAME = "py_script_worker" PY_SCRIPT_PATH = "./script.py" CHECK_INTERVAL = 5 def check_script_alive(): # 检测指定screen会话是否存在 screen_list = subprocess.run(["screen", "-ls"], capture_output=True, text=True).stdout screen_alive = SCREEN_NAME in screen_list # 检测目标Python进程是否存在 proc_check = subprocess.run(["pgrep", "-f", f"python3 {PY_SCRIPT_PATH}"], capture_output=True) proc_alive = proc_check.returncode == 0 return screen_alive and proc_alive while True: if check_script_alive(): time.sleep(CHECK_INTERVAL) else: # 清理残留异常会话 subprocess.run(["screen", "-S", SCREEN_NAME, "-X", "quit"], capture_output=True) # 新建后台screen启动目标脚本 subprocess.run(["screen", "-dmS", SCREEN_NAME, "python3", PY_SCRIPT_PATH]) time.sleep(CHECK_INTERVAL)
补充说明
- 所有路径优先使用绝对路径,避免执行命令时工作目录不对导致找不到脚本文件
- 检测间隔默认5秒,可自行修改
CHECK_INTERVAL的值调整检测频率 - 如果需要实例重启后自动启动监控,可将监控脚本的启动命令添加到
/etc/rc.local文件中,并给rc.local添加执行权限即可实现开机自启
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

