#!/bin/python3
from common import start_process_single, MONITOR_PATH
SERVICE_NAME = '{}'
start_process_single(MONITOR_PATH, '{}', [SERVICE_NAME])
— start.txt
#!/bin/python3
import os
from common import start_process_single, MAIN_PATH
SERVICE_NAME = '{}'
MAIN = os.path.join(MAIN_PATH, f'{SERVICE_NAME}.py')
start_process_single(MAIN, '{}')
— stop.txt
#!/bin/python3
from common import kill_process
SERVICE_NAME = '{}'
MODEL = '{}'
kill_process('monitor', [MODEL, SERVICE_NAME])
kill_process('info_collector.py', [MODEL])
– init.py
from.__main__ import*from.__out__ import*
– main.py
import os
import re
import sys
import time
from.__out__ import GUNICORN_PATH_OF_WINDOWS, GUNICORN_PATH_OF_LINUX
from.__out__ import PYTHON_PATH_OF_WINDOWS, PYTHON_PATH_OF_LINUX
from.__out__ import get_logger
logger = get_logger(__file__)defget_python():"""
获取python路径
@return:
"""if sys.platform[0:3]=='win':
python = PYTHON_PATH_OF_WINDOWS
elif sys.platform[0:5]=='linux':
python = PYTHON_PATH_OF_LINUX
else:
logger.error('Mac?')raise Exception('Mac?')
check_file(python)return python
defget_gunicorn():"""
获取gunicorn路径
@return:
"""if sys.platform[0:3]=='win':
gunicorn = GUNICORN_PATH_OF_WINDOWS
elif sys.platform[0:5]=='linux':
gunicorn = GUNICORN_PATH_OF_LINUX
else:
logger.error('Mac?')raise Exception('Mac?')
check_file(gunicorn)return gunicorn
defcheck_file(file:str):"""
检查文件
@param file:
@return:
"""ifnot os.path.isfile(file):
logger.error(f'can not found {file}.')raise Exception(f'can not found {file}.')defcheck_dir(_dir:str):"""
检查文件
@param _dir:
@return:
"""ifnot os.path.isdir(_dir):
logger.error(f'can not found {_dir}.')raise Exception(f'can not found {_dir}.')defcheck_process(name:str, params:list=None, ignores:list=None):"""
检查进程
@param name:
@param params:
@param ignores:
@return:
"""if sys.platform[0:3]=='win':# TODO developeraise Exception('Check_process of win is undeveloped.')elif sys.platform[0:5]=='linux'or sys.platform[0:3]=='mac':
cmd =f'ps aux|grep -v grep|grep -v check|grep {name}'if params:for _param in params:
cmd = cmd +f'|grep {_param}'if ignores:for ignore in ignores:
cmd = cmd +f'|grep -v {ignore}'
res = os.popen(cmd)
is_active =False
processes =[]for process in res:
_process = re.sub(' +',' ', process)
processes.append(_process[:-1])
is_active =Truereturn is_active, processes
else:
logger.error('Unknow system.')raise Exception('Unknow system.')defstart_process(path:str, mode:str=None, params:list=None, log_path=None, nohup=False):"""
启动进程
@param path: 程序路径
@param mode: 程序模式
@param params: 参数
@param log_path: 日志路径
@param nohup: 是否后台启动
@return:
"""
check_file(path)
python = get_python()
cmd =f'{python}{path}{mode}'if params:for param in params:
cmd = cmd +f' {param}'if nohup:if sys.platform[0:3]=='win':
os.system(f'nohup {cmd} >{log_path if log_path else"NUL"} 2>&1 &')elif sys.platform[0:5]=='linux'or sys.platform[0:3]=='mac':
os.system(f'nohup {cmd} >{log_path if log_path else"/dev/null"} 2>&1 &')else:
logger.error('Unknow system.')raise Exception('Unknow system.')else:
os.system(cmd)defstart_process_single(path:str, mode:str=None, params:list=None, ignores:list=None, log_path=None):"""
启动单例进程
@param path: 程序路径
@param mode: 程序模式
@param params: 参数
@param ignores: 检查忽略
@param log_path: 日志路径
@return:
"""
process = os.path.split(path)[-1]
is_active, processes = check_process(process, params, ignores)
info =f'{process}{mode} '+' '.join(params or[])if is_active:for process in processes:
logger.warning(f'{info} is already started at {process.split(" ")[1]}.')returnelse:
logger.info(f'{info} is starting...')
start_process(path, mode, params, log_path, nohup=True)
time.sleep(1)
is_active, processes = check_process(process, params, ignores)if is_active:for process in processes:
logger.info(f'{info} is started at {process.split(" ")[1]}.')else:
logger.error(f'{info} startup failed.')defkill_process(name:str, params:list=None, ignores:list=None):"""
关闭进程
@param name: 程序名称/路径
@param params: 参数
@param ignores: 程序忽略
@return:
"""
is_active, processes = check_process(name, params, ignores)
info =f'{name} '+' '.join(params or[])if is_active:
cmd =f'ps aux|grep -v grep|grep {name}'if params:for _param in params:
cmd = cmd +f'|grep {_param}'if ignores:for ignore in ignores:
cmd = cmd +f'|grep -v {ignore}'
cmd =f"{cmd}|tr -s ' '| cut -d ' ' -f 2"
res = os.popen(cmd)for row in res:
logger.info(f'{info} is active at {row[:-1]}, killing it.')
os.system(f'kill -9 {row}')
is_active, processes = check_process(name, params, ignores)if is_active:for process in processes:
logger.error(f'{info} is still active at {process.split(" ")[1]}.')else:
logger.info(f'{info} is stoped.')else:
logger.warning(f'{info} is not started.')defcheck_gunicorn(name:str,):"""
检查进程
@param name:
@return:
"""if sys.platform[0:3]=='win':# TODO developeraise Exception('Check_gunicorn of win is undeveloped.')elif sys.platform[0:5]=='linux'or sys.platform[0:3]=='mac':
cmd =f'pstree -ap|grep -v grep|grep gunicorn|grep {name}'
res = os.popen(cmd)
is_active =False
processes =[]
pids =[]for process in res:
_process = re.sub(' +',' ', process)
main = re.search(r'gunicorn,(\d+)', process)if main:
pids.append(main[1])
processes.append(_process[:-1])
is_active =Truereturn is_active, processes, pids
else:
logger.error('Unknow system.')raise Exception('Unknow system.')defstart_gunicorn(path:str, params:list=None, app='app', restart=False):
params = params or[]
process_file = os.path.split(path)[-1]
process_dir = path.split(process_file)[0]
process_name = process_file.split('.py')[0]
is_active, processes_of_main, pids = check_gunicorn(process_name)
paramsstr =' '.join(params)if is_active and restart isFalse:
logger.warning(f'{process_name} is already started at {pids[0]}.')elifnot is_active and restart:
logger.warning(f'{process_name} is not started .')elif is_active and restart:
cmd =f'kill -HUP {pids}'
os.system(cmd)else:
gunicorn = get_gunicorn()
cmd =f'{gunicorn}{process_name}:{app}{paramsstr} --chdir {process_dir}'
logger.info(cmd)
os.system(cmd)
is_active, processes_of_main, pids = check_gunicorn(process_name)if is_active:
logger.info(f'{process_name} is started at {pids}')else:
logger.error(f'{process_name} can not start.')defkill_gunicorn(path:str):"""
关闭进程
@param path: 程序名称/路径
@return:
"""
process_file = os.path.split(path)[-1]
process_name = process_file.split('.py')[0]
is_active, processes_of_main, pids = check_gunicorn(process_name)if is_active:
cmd =f'kill -9 {" ".join(pids)}'
os.system(cmd)
is_active, processes_of_main, pids = check_gunicorn(process_name)if is_active:
logger.error(f'{process_name} can not stop.')else:
logger.info(f'{process_name} is stoped.')else:
logger.warning(f'{process_name} is not started.')