亲测有效Python获取进程id,自动执行Flask服务

【计划昵称全网统一,代码随想随记,知乎无法立即修改,,】
微信公众号:leetcode_algos_life,代码随想随记
小红书:412408155
CSDN:https://blog.csdn.net/woai8339?type=blog ,代码随想随记
GitHub: https://github.com/riverind
抖音【暂未开始,计划开始】:tian72530,代码随想随记
知乎【暂未开始,计划开始】:happy001

问题

(1)自动获取进程id
(2)对Flask服务做进程监控,防止服务挂了

解决方案

(1)获取进程id

def get_pid_from_port(port):
	#其中"为转义"
    pid = os.popen("netstat -nlp | grep :%s | awk '{print $7}' | awk -F" / " '{ print $1 }'" % (port)).read().split('/')[0]
    return pid

这里的port直接是int类型的端口号,比如,9001。
如果该端口进程存在,则返回字符串类型的进程id
如果该端口进程不存在,则返回字符串类型为空,字符串长度为0【即返回""】

(2)对Flask进程做监控

这里分两个部分:
一是端口进程监控,看进程是否存在。
二是自动执行脚本。
其中第一个事情,监控服务端口达到监控服务的目的,通过判断pid即可。
第二,自动执行脚本。
如果一个Flask服务,通过命令行形式指定端口启动服务,即:

import argparse
parser = argparse.ArgumentParser(description='命令行参数')
parser.add_argument('--port', '-p', type=str, help='参数port,必须参数', required=True)
args = vars(parser.parse_args())

host = '0.0.0.0'

app.run(host=host, port=args['port'], debug=False, threaded=True)

将该脚本命名为主程序,main.py

则自动运行程序代码为:

def run_python_script(port):
    os.system("nohup python main.py --port " + str(port) + "&")
    print("正在启动:%s"%(port))

此时,可以通过pid来进行服务自动监控:

port = 9008
pid = get_pid_from_port(port)
if pid == -1:
    run_python_script(single_port)
    return "端口号为{}, pid 为{}的服务开始启动".format(port, pid)
else:
    return "端口号为{}, pid 为{}的服务已经在运行中".format(port, pid)