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