diff --git a/main_start.py b/main_start.py index db5c53f..d9ecd9c 100644 --- a/main_start.py +++ b/main_start.py @@ -1,6 +1,6 @@ # main_start.py # 主启动脚本:读取配置并通过 subprocess 启动 rtsp_service_ws_kadian.py -# 支持 start 和 status 命令,默认执行 start +# 支持 start, stop, restart, status 命令,默认执行 start import json import yaml @@ -10,6 +10,7 @@ import sys import os import signal import argparse +import time from typing import List from common.camera_config import CameraConfig @@ -108,7 +109,6 @@ def start_service(): try: process = start_rtsp_service(cameras_base64) # 等待一下确保进程启动 - import time time.sleep(1) # 4. 保存PID @@ -141,16 +141,84 @@ def status_service(): return False +def stop_service(force=False): + """停止服务""" + pid = read_pid() + if not pid: + logger.error("[ERROR] No PID file found, service may not be running") + return False + + if not is_process_running(pid): + logger.warning(f"[WARN] Process with PID {pid} is not running, cleaning up PID file") + try: + os.remove(PID_FILE) + except: + pass + return True + + # 发送终止信号 + try: + if force: + logger.info(f"[INFO] Force killing process {pid} with SIGKILL") + os.kill(pid, signal.SIGKILL) + else: + logger.info(f"[INFO] Gracefully stopping process {pid} with SIGTERM") + os.kill(pid, signal.SIGTERM) + + # 等待进程结束(最多10秒) + for i in range(10): + if not is_process_running(pid): + break + time.sleep(1) + + # 如果进程还在,强制杀死 + if is_process_running(pid): + logger.warning(f"[WARN] Process {pid} still running after SIGTERM, sending SIGKILL") + os.kill(pid, signal.SIGKILL) + time.sleep(1) + + # 清理PID文件 + if os.path.exists(PID_FILE): + os.remove(PID_FILE) + + logger.info(f"[INFO] Service stopped successfully (PID: {pid})") + return True + except Exception as e: + logger.error(f"[ERROR] Failed to stop service: {e}") + return False + + +def restart_service(): + """重启服务""" + logger.info("[INFO] Restarting service...") + + # 先停止 + if status_service(): + stop_service() + time.sleep(2) # 等待进程完全停止 + + # 再启动 + return start_service() + + def main(): parser = argparse.ArgumentParser(description="RTSP Service Manager") - parser.add_argument("command", nargs="?", choices=["start", "status"], default="start", - help="Command to execute: start, status (default: start)") + parser.add_argument("command", nargs="?", choices=["start", "stop", "restart", "status"], default="start", + help="Command to execute: start, stop, restart, status (default: start)") + parser.add_argument("--force", action="store_true", + help="Force stop (send SIGKILL immediately)") args = parser.parse_args() if args.command == "start": success = start_service() sys.exit(0 if success else 1) + elif args.command == "stop": + success = stop_service(force=args.force) + sys.exit(0 if success else 1) + elif args.command == "restart": + success = restart_service() + sys.exit(0 if success else 1) elif args.command == "status": success = status_service() sys.exit(0 if success else 0) # 状态检查总是返回0退出码