python监听一些特定端口的服务,如果检测到崩溃,进行重启。

近期需要实现服务器上跑过个服务,然后供用户使用,由于内存及用户量的问题,总是隔段时间会导致某个服务被kill。 人力重启实在是太熬人,所以写了段python来监听。如果发现哪个崩了,就对其进行重启。

先上一段错误示例

import subprocess
import time

# 定义需要检测的端口号
PORTS = [6007, 6008]

# 定义每个端口对应的启动脚本文件名
START_SCRIPTS = {
    6007: "6007start.py",
    6008: "6008start.py"
}

while True:
    for port in PORTS:
        # 检测端口是否正常
        result = subprocess.run(["lsof", "-i", f":{port}"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        if result.returncode != 0:
            # 端口崩溃,执行对应的启动脚本
            print(f"Port {port} crashed, restarting...")
            subprocess.run(["python", START_SCRIPTS[port]])
        else:
            # 端口正常
            print(f"Port {port} is running")

    # 休眠5秒后继续监测
    time.sleep(5)

这个是能检测并重启了,但是蛋疼的是,检测到并重启后,就把监听的服务挤没了。。 没法继续监听,属于一次性的,这肯定不是我们想要的。

于是优化一下:

import subprocess
import time
import multiprocessing

# 定义需要检测的端口号
PORTS = [6007, 6008]

# 定义每个端口对应的启动脚本文件名
START_SCRIPTS = {
    6007: "6007start.py",
    6008: "6008start.py"
}

def start_process(port):
    subprocess.run(["python", START_SCRIPTS[port]])

if __name__ == "__main__":
    while True:
        for port in PORTS:
            # 检测端口是否正常
            result = subprocess.run(["lsof", "-i", f":{port}"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            if result.returncode != 0:
                # 端口崩溃,启动子进程执行对应的启动脚本
                print(f"Port {port} crashed, restarting...")
                p = multiprocessing.Process(target=start_process, args=(port,))
                p.start()

                # 等待5秒,确保子进程启动服务成功
                time.sleep(5)
            else:
                # 端口正常
                print(f"Port {port} is running")

        # 休眠5秒后继续监测
        time.sleep(5)

保证监听运行在主任务,其余是开启的子进程。 注意while里面的sleep了5s,是为了等待子进程启动完毕(否则子线程启动的过程中,监听还会继续,会导致启动一大堆服务!),这个写法还可以优化,欢迎大家帮忙

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值