让代码更简单

python通过PID/端口查询进程信息

重要:本文最后更新于2023-03-09 21:33:14,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

有时使用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定时任务定时执行此程序即可,如果主程序退出,此定时程序将会重启主程序。

感觉很棒!可以赞赏支持我哟~

1 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐