Files
Arknights_Tools/start_server.py
T
2026-05-08 16:28:20 +08:00

66 lines
1.8 KiB
Python

import subprocess
import time
import socket
import os
import logging
from datetime import datetime
from pathlib import Path
from src.My_Logger.project_logger import LoggerClass
LOG_PATH = Path(__file__).parent / 'logs'
def is_port_in_use(port: int) -> bool:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
return s.connect_ex(('192.168.195.194', port)) == 0
def start_server():
"""
launch a micro service using gunicorn
:return:
"""
launch_file_name = 'run_service_backend' # file name of the entrance point
pid_path = LOG_PATH / 'pid.txt'
IP = '192.168.195.194'
PORT = 59001
WORKER = 1
TIME_OUT = 60
THREADS = 5
logger = LoggerClass().get_log(logging.INFO)
if is_port_in_use(PORT):
logger.error(f'Port {PORT} already in use')
return
now = datetime.now()
cmd = [
"nohup",
"/home/armor/anaconda3/envs/py311/bin/gunicorn",
"--threads", str(THREADS),
"--workers", str(WORKER),
"--bind", f"{IP}:{PORT}", f"{launch_file_name}:app",
"--timeout", str(TIME_OUT),
"--pid", pid_path
]
stdout_file = LOG_PATH / f"console_{now.year}-{now.month}-{now.day}.log"
pid = subprocess.Popen(cmd, stdout=stdout_file.open('a'), stderr=subprocess.STDOUT, close_fds=True, start_new_session=True).pid
time.sleep(5)
if not is_port_in_use(PORT) or not os.path.exists(pid_path) or str(pid) != pid_path.read_text().strip():
logger.error(f'Failed to start server, check {stdout_file} and {pid_path}')
print(f">> tail {stdout_file}")
subprocess.run(["tail", str(stdout_file)])
return
info_str = f"Server started"
logger.info(info_str)
logger.info(f"server running at {IP}:{PORT} with pid {pid}")
if __name__ == "__main__":
start_server()