最近在linux中使用nohup运行py文件时,有几个py文件经常挂掉,于是在网上找了一下原因
-
网络连接问题,使用了异步io,网不稳定会导致断掉;服务器用的网线
-
异常处理,try-except,;有异常处理
-
长时间运行,将time.sleep换成异步暂停;效果不太明显
-
资源受限;不太可能
总而言之,言而总之,都试了,不太行;于是,就想着既然从文件中无法下手,那可不可以从进程那里去寻找解决办法。今天,它来了,用到py中subprocess库,需要安装,服务器需要离线在pypi.org下载适合自己py版本的whl;废话不多说,看代码
import os
import subprocess
import logging
def check_processes():
cmd = "pgrep -d ' ' -f ." # 使用pgrep命令获取所有运行中的进程号
try:
output = subprocess.check_output(cmd, shell=True, text=True)
pid_list = output.strip().split(' ')
except subprocess.CalledProcessError:
pid_list = []
return pid_list
def check_process_status(pid):
if os.path.exists(f"/proc/{pid}"): # 检查进程是否存在
return True
return False
def restart_process(pid):
cmd = f"cat /proc/{pid}/cmdline" # 根据进程号获取对应的启动命令行
try:
output = subprocess.check_output(cmd, shell=True)
cmdline = output.replace(b'\x00', b' ').decode().strip()
logging.info(f"重启进程 {pid},命令: {cmdline}")
subprocess.run(cmdline, shell=True) # 执行重新启动命令
except subprocess.CalledProcessError as e:
logging.info(f"重启进程 {pid} 失败:", e)
if __name__ == "__main__":
pid_list = check_processes() # 获取所有进程号列表
logging.info(f"当前运行中的进程数: {len(pid_list)}")
# 检测进程状态并重新启动挂掉的进程
for pid in pid_list:
if not check_process_status(pid):
logging.info(f"进程 {pid} 挂掉,重新启动...")
restart_process(pid)
OK!感兴趣的小伙伴可以尝试一下
(待更新)