新增stop,restart

This commit is contained in:
zqc
2026-02-26 15:56:38 +08:00
parent b59aec5f7f
commit ad5d6ebf8f

View File

@@ -1,6 +1,6 @@
# main_start.py # main_start.py
# 主启动脚本:读取配置并通过 subprocess 启动 rtsp_service_ws_kadian.py # 主启动脚本:读取配置并通过 subprocess 启动 rtsp_service_ws_kadian.py
# 支持 start status 命令,默认执行 start # 支持 start, stop, restart, status 命令,默认执行 start
import json import json
import yaml import yaml
@@ -10,6 +10,7 @@ import sys
import os import os
import signal import signal
import argparse import argparse
import time
from typing import List from typing import List
from common.camera_config import CameraConfig from common.camera_config import CameraConfig
@@ -108,7 +109,6 @@ def start_service():
try: try:
process = start_rtsp_service(cameras_base64) process = start_rtsp_service(cameras_base64)
# 等待一下确保进程启动 # 等待一下确保进程启动
import time
time.sleep(1) time.sleep(1)
# 4. 保存PID # 4. 保存PID
@@ -141,16 +141,84 @@ def status_service():
return False 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(): def main():
parser = argparse.ArgumentParser(description="RTSP Service Manager") parser = argparse.ArgumentParser(description="RTSP Service Manager")
parser.add_argument("command", nargs="?", choices=["start", "status"], default="start", parser.add_argument("command", nargs="?", choices=["start", "stop", "restart", "status"], default="start",
help="Command to execute: start, 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() args = parser.parse_args()
if args.command == "start": if args.command == "start":
success = start_service() success = start_service()
sys.exit(0 if success else 1) 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": elif args.command == "status":
success = status_service() success = status_service()
sys.exit(0 if success else 0) # 状态检查总是返回0退出码 sys.exit(0 if success else 0) # 状态检查总是返回0退出码