新增stop,restart
This commit is contained in:
@@ -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退出码
|
||||
|
||||
Reference in New Issue
Block a user