解决linux中python进程中断问题

最近在linux中使用nohup运行py文件时,有几个py文件经常挂掉,于是在网上找了一下原因

  1. 网络连接问题,使用了异步io,网不稳定会导致断掉;服务器用的网线

  2. 异常处理,try-except,;有异常处理

  3. 长时间运行,将time.sleep换成异步暂停;效果不太明显

  4. 资源受限;不太可能

总而言之,言而总之,都试了,不太行;于是,就想着既然从文件中无法下手,那可不可以从进程那里去寻找解决办法。今天,它来了,用到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!感兴趣的小伙伴可以尝试一下

(待更新)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值