一、Python脚本管理启动

import os
import time


def get_pid(itme):
    """
    通过项目名查询 pid
    :param itme: 项目名
    :return: pid
    """
    pids = os.popen("pgrep -f {}".format(itme))
    pids = pids.read()
    print(item, "的进程pid:", pids, type(pids))
    return pids


def kill_item(item):
    """
    通过项目名kill进程
    :param item: 项目名
    :return: 结果
    """
    result = os.popen("pkill -f {}".format(item))
    print("killed --------", result.read())
    return result.read()


def start_item(item, start_commond):
    """
    通过项目名和启动命令 启动项目
    :param item: 项目名
    :param start_commond: 启动命令
    :return:
    """
    result = os.popen(start_commond)
    print("starting-------{}".format(str(result.read())))
    time.sleep(10)
    if get_pid(item):
        print("{} started".format(item))


def start(item, start_command):
    print("当前项目启动状态:{}".format(get_pid(item)))
    if get_pid(item):  # 启动时重启
        print("当前项目已启动, 准备kill------------")
        kill_item(item)
        print("kill 成功--------------")
        time.sleep(10)
        start_item(item, start_command)
        print("重启成功-----------------")
    else:  # 未启动时启动
        start_item(item, start_command)


if __name__ == '__main__':
    item = "manage_qa_tools"  # 项目名
    start_command = "nohup python -u manage_qa_tools.py >qa_tools_server.log 2>&1 &"  # 后台启动命令
    start(item, start_command)

1、使用os.popen() 方法可以获取命令执行的返回结果   直接执行linux 命令即可

2、获取服务进程id:pgrep -f  [服务名]

3、启动服务使用nohup Python -u 启动文件名 >日志文件名 2>&1 &   # 第一个> 是将nohup启动的服务日志重定向到指定日志文件中;2>&1 表示 将错误日志(2表示错误日志等级)重定向到一般日志(1表示一般日志);最后一个& 表示后台运行。

4、杀死服务: pkill -f  [服务名]


二、gunicorn 启动

pip install gunicorn  # 安装
常用参数
-c CONFIG, --config=CONFIG- 以$(PATH)、file:$(PATH)、 或的形式指定配置文件 python:$(MODULE_NAME)。
-b BIND, --bind=BIND- 指定要绑定的服务器套接字。服务器插槽可以是任意的$(HOST),$(HOST):$(PORT),fd://$(FD),或 unix:$(PATH)。IP 是有效的$(HOST).
-w WORKERS, --workers=WORKERS- 工作进程的数量。这个数字通常应该在服务器中每个核心 2-4 个工作人员之间。查看常见问题解答以了解有关调整此参数的想法。
-k WORKERCLASS, --worker-class=WORKERCLASS- 要运行的工作进程的类型。您肯定希望阅读生产页面以了解此参数的含义。您可以设置这$(NAME) 其中$(NAME)的一个sync,eventlet,gevent, tornado,gthread。 sync是默认值。有关更多信息,请参阅worker_class文档。
-n APP_NAME, --name=APP_NAME- 如果安装了setproctitle,您可以调整 Gunicorn 进程的名称,因为它们出现在进程系统表中(这会影响ps和 等工具top)
# 启动项目服务
$ python3 -m gunicorn -w 2 -b 0.0.0.0:5005 [包含app对象的.py文件名]:[app实例对象名]

使用 setup.sh 启动 gunicorn 

#!/bin/bash
logs_path=/home/work/webapps/qa-tools-qa/logs
setup_path=/home/work/webapps/qa-tools-qa
setup_name=manage_qa_tools


if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi

if [ "$setup_name" = "" ];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi

function start()
{
	if [ ! -d "$logs_path" ];then
		mkdir -p $logs_path
	fi
    count=`ps -ef |grep python|grep $setup_name|grep -v grep|wc -l`
    if [ $count != 0 ];then
        echo "$setup_name is running..."
    else
        cd $setup_path
        python3.7 -m gunicorn -w 2 -b 0.0.0.0:5005 manage_qa_tools:app >$logs_path/start.log 2>&1 &
        sleep 3
        echo "Start $setup_name success..."
    fi
}

function stop()
{
    echo "Stop $setup_name"
    boot_id=`ps -ef |grep python|grep $setup_name|grep -v grep|awk '{print $2}'`
    count=`ps -ef |grep python|grep $setup_name|grep -v grep|wc -l`

    if [ $count != 0 ];then
        ps -ef|grep python3.7|grep $setup_name|grep -v grep|cut -c 9-15|xargs kill -9
        sleep 5
        pid_count=`ps -ef |grep python|grep $setup_name|grep -v grep|wc -l`
        if [ $pid_count != 0 ];then
            pid=`ps -ef |grep python|grep $setup_name|grep -v grep|awk '{print $2}'`
            kill -9 $boot_id
        fi
    fi
}

function restart()
{
    stop
    sleep 2
    start
}

function status()
{
    count=`ps -ef |grep python|grep $setup_name|grep -v grep|wc -l`
    if [ $count != 0 ];then
        echo "$setup_name is running..."
    else
        echo "$setup_name is not running..."
    fi
}

case $1 in
    start)
    start;;
    stop)
    stop;;
    restart)
    restart;;
    status)
    status;;
    *)

    echo -e "\033[0;31m Usage: \033[0m  \033[0;34m sh  $0  {start|stop|restart|status}  {SpringBootJarName} \033[0m
\033[0;31m Example: \033[0m
      \033[0;33m sh  $0  start esmart-test.jar \033[0m"
esac

注意:使用 gunicorn 启动时可以指定多个进程,这样可以使服务运行更流畅;停止服务时,需要同时停止多个进程,命令如下:

# 杀掉多同一个服务的多个进程
ps -ef|grep python3.7|grep -v grep|cut -c 9-15|xargs kill -9

# 命令逐步解释
ps - ef          查看所有服务的进程信息
grep python3.7   会输出全部含有关键字"python3.7"的进程
grep -v grep     grep -v [name] 是过滤掉某个关键字name的进程
cut -c 9-15      是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
xargs kill -9    xargs命令是用来把前面命令的输出结果(也就是PID)作为"kill -9"命令的参数,并执行该令。
kill -9          强制杀掉指定进程