前言
话说我把程序部署在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()