有时使用python写了个服务在后台运行,但由于各种问题导致出错程序退出。为了能够自动重启服务,可以使用python写个监听程序,当然也能通过写入开机启动项实现,这里不讨论。
首先安装python模块
复制
pip install psutil
示例代码
复制
# 引入psutil模块 import psutil # 判断某个程序是否在运行 # 原理:获取正在运行程序的pid,通过pid获取程序名,再按程序名进行判断 def ifProcessRunning(process_name): pl = psutil.pids() result = "PROCESS_IS_NOT_RUNNING" for pid in pl: if (psutil.Process(pid).name() == process_name): if isinstance(pid, int): result = "PROCESS_IS_RUNNING" return result def netpidport(pid: int): """根据pid寻找该进程对应的端口""" alist = [] # 获取当前的网络连接信息 net_con = psutil.net_connections() for con_info in net_con: if con_info.pid == pid: alist.append({pid:con_info.laddr.port}) return alist def netportpid(port: int): """根据端口寻找该进程对应的pid""" adict = {} # 获取当前的网络连接信息 net_con = psutil.net_connections() for con_info in net_con: if con_info.laddr.port == port: adict[port] = con_info.pid return adict def porttopid(port: int): """根据端口判断是否存在程序""" isrunning = False # 获取当前的网络连接信息 net_con = psutil.net_connections() for con_info in net_con: if con_info.laddr.port == port: isrunning = True return isrunning print(porttopid(8000)) print(porttopid(5468)) print(porttopid(5555))
然后通过Popen
操作重新启动程序即可。
复制
import psutil from subprocess import Popen def porttopid(port: int): isrunning = False net_con = psutil.net_connections() for con_info in net_con: if con_info.laddr.port == port: isrunning = True return isrunning if not porttopid(8000): proc = Popen( args='nohup python3 /www/test.py $', shell=True ) print("启动程序") else: print("程序正在运行")
最后通过宝塔计划任务或者Linux定时任务定时执行此程序即可,如果主程序退出,此定时程序将会重启主程序。
评论 (0)