devops/tool/tool.py
2024-12-24 15:52:43 +08:00

102 lines
2.4 KiB
Python

import os
import sys
import subprocess
import configparser
help_message = """
Usage: app.ini [options]
start start the server
stop stop the server
restart restart the server
status get the server status
"""
cfg = None
FuncMap = {}
dir_path = ""
app_path = ""
def main():
global cfg, dir_path, app_path
if len(sys.argv) < 2:
print(help_message)
sys.exit(1)
# 获取当前文件的绝对路径
exec_path = os.path.abspath(sys.argv[0])
dir_path = os.path.dirname(exec_path)
# print(f"当前文件的绝对路径的文件夹路径: {dir_path}")
# 加载 app.ini 文件
cfg = configparser.ConfigParser()
cfg.read(os.path.join(dir_path, "app.ini"))
app_path = cfg.get("app", "app_path")
register("start", start)
register("stop", stop)
func_name = sys.argv[1]
if func_name in FuncMap:
FuncMap[func_name]()
else:
print(help_message)
sys.exit(1)
def register(name, func):
FuncMap[name] = func
def start():
print("start")
NodeType = sys.argv[2]
Zone = sys.argv[3]
app_name = cfg.get("app", "app_name")
cmd_name = app_path + "/main"
cmd_args = [f"{app_path}/zone/{app_name}_{NodeType}_{Zone}/server.json"]
# 创建命令
cmd = [cmd_name] + cmd_args
print(cmd)
# 启动命令
process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, start_new_session=True)
print(f"p {process.pid} s")
# 获取命令输出
stdout, stderr = process.communicate()
print("e:", stdout.decode('utf-8', errors='ignore'))
print("e2:", stderr.decode('utf-8', errors='ignore'))
def stop():
print("stop")
NodeType = sys.argv[2]
Zone = sys.argv[3]
app_name = cfg.get("app", "app_name")
process_args = f"{app_path}/zone/{app_name}_{NodeType}_{Zone}/server.json"
# 获取进程号
pid = get_pid_by_args(process_args)
if pid is None:
print("未找到进程")
sys.exit(1)
# 关闭进程
try:
os.kill(pid, 9)
print(f"进程 {pid} 已关闭")
except OSError as e:
print(f"关闭进程失败: {e}")
sys.exit(1)
def get_pid_by_args(args):
try:
output = subprocess.check_output(["pgrep", "-f", args])
pid_str = output.decode().strip().split("\n")[0]
return int(pid_str)
except subprocess.CalledProcessError:
return None
if __name__ == "__main__":
main()