[Tool] 多进程程序中断自动重启

前言 

话说我把程序部署在ubuntu上,由于我特别担心程序中断,所以我加了非常非常多的try except ,因此导致了程序失败却还在运行,与其如此不如 “他错任他错,重启来补过”。所以写了个多进程重启程序。

代码

这个重启程序需要和shell脚本配合,对每一个进程进行pid监控,一旦发现该pid消失就立即重启整个程序。

shell脚本

for i in $(seq 1 10)
do
      old_ids=$(ps -ef | grep python | awk '{print $2}');
      #echo "$old_ids"
      kill -9 $old_ids;
done

cd /home/。。。。/pythonwork
nohup python3 main.py > /dev/null 2>&1& #./log.log

python多进程代码

import multiprocessing
import time
import psutil
import os
from loguru import logger

ROOTPATH = os.path.dirname(os.path.abspath(__file__))

logger.add(sink='log/log_{time}_main.log', level='DEBUG', enqueue=True,rotation='00:00', retention="7 days")
def _pull_img(share_dic):
    print("_pull_img")
    logger.info("pull")
    _pid = os.getpid()
    print(share_dic["algo_pids"])
    share_dic["pull_pids"]=_pid

    time.sleep(50)
    a=0/0

    pass

def _algo(share_dic):
    print("_algo")

    logger.info("algo")
    _pid = os.getpid()
    share_dic["algo_pids"]=_pid
    time.sleep(100)
    pass

def _supervisor(share_dic):
    logger.info("_supervisor")
    while True:


        if share_dic["algo_pids"]==-1 or share_dic["pull_pids"]==-1 :
            time.sleep(10)
        else:
            pl = psutil.pids()
            if share_dic["algo_pids"] not in pl:
                logger.info("algo_pids进程意外终止,开始重启进程reset")
                cmd = f"{ROOTPATH}/algo_kill_and_run.sh"
                os.system(cmd)
            elif share_dic["pull_pids"] not in pl:
                logger.info("algo_pids进程意外终止,开始重启进程reset")
                cmd = f"{ROOTPATH}/algo_kill_and_run.sh"
                os.system(cmd)

            time.sleep(30)


def main():
    # share_parame = multiprocessing.Array('i', [False])

    share_dic = multiprocessing.Manager().dict()
    share_dic["box_changed"] = False  # 绘制区域是否改变,True为改变
    share_dic["last_angle"] = 0  # 上一个角度
    share_dic["algo_pids"] = -1
    share_dic["pul_pids"] = -1




    pull_q = multiprocessing.Queue(30)
    alarm_q = multiprocessing.Queue(60)

    # 拉流
    p_pull_img = multiprocessing.Process(target=_pull_img, args=(share_dic,))

    # 算法
    p_algo = multiprocessing.Process(target=_algo, args=(share_dic,))



    #监控进程
    p_supervisor=multiprocessing.Process(target=_supervisor, args=(share_dic,))

    p_pull_img.start()
    p_algo.start()
    p_supervisor.start()

    p_pull_img.join()
    p_algo.join()
    p_supervisor.join()

if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/qq_55542491/article/details/132714647