#!/bin/bash # Auto-generated control script # Usage: ./control.sh {start|stop|restart|status} BASE_DIR="/home/smart/pythonPJ/upc_resent" PYTHON_PATH="/usr/bin/python3" # 设备列表: ID 名称 协议 DEVICES=( "dev1" "设备73-TCP" "TCP" "dev2" "设备125-TCP" "TCP" "dev3" "设备UDP示例" "UDP" ) # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color show_help() { echo "Usage: $0 {start|stop|restart|status}" echo "" echo "Commands:" echo " start 启动所有服务" echo " stop 停止所有服务" echo " restart 重启所有服务" echo " status 查看服务状态" } check_root() { if [[ $EUID -ne 0 ]]; then echo -e "${YELLOW}Warning: 建议使用 root 权限运行${NC}" fi } start_service() { local device_id=$1 local device_name=$2 local protocol=$3 local script_path="$BASE_DIR/bin/$device_id.py" # 检查进程是否已存在(使用更精确的匹配) local pid=$(pgrep -f "${PYTHON_PATH}.*${script_path}" | head -1) if [[ -n "$pid" ]]; then echo -e "[${YELLOW}SKIP${NC}] $device_name ($device_id) - ${protocol} 已在运行 (PID: $pid)" return 0 fi echo -n "[START] $device_name ($device_id) - ${protocol} ... " nohup $PYTHON_PATH "$script_path" > /dev/null 2>&1 & sleep 1 # 检查是否启动成功 pid=$(pgrep -f "${PYTHON_PATH}.*${script_path}" | head -1) if [[ -n "$pid" ]]; then echo -e "${GREEN}OK${NC} (PID: $pid)" return 0 else echo -e "${RED}FAILED${NC}" return 1 fi } stop_service() { local device_id=$1 local device_name=$2 local protocol=$3 local script_path="$BASE_DIR/bin/$device_id.py" # 使用更精确的匹配模式 local pids=$(pgrep -f "${PYTHON_PATH}.*${script_path}") if [[ -z "$pids" ]]; then echo -e "[${YELLOW}SKIP${NC}] $device_name ($device_id) - 未运行" return 0 fi # 获取第一个匹配的 PID local pid=$(echo "$pids" | head -1) echo -n "[STOP] $device_name ($device_id) - ${protocol} (PID: $pid) ... " # 结束所有匹配的进程 echo "$pids" | while read -r p; do kill "$p" 2>/dev/null done # 等待进程结束 local i for i in {1..10}; do sleep 0.5 pids=$(pgrep -f "${PYTHON_PATH}.*${script_path}" || true) if [[ -z "$pids" ]]; then break fi done # 检查是否还有残留进程 pids=$(pgrep -f "${PYTHON_PATH}.*${script_path}" || true) if [[ -n "$pids" ]]; then # 强制结束残留进程 echo "$pids" | while read -r p; do kill -9 "$p" 2>/dev/null done sleep 0.5 fi # 最终检查 pids=$(pgrep -f "${PYTHON_PATH}.*${script_path}" || true) if [[ -z "$pids" ]]; then echo -e "${GREEN}OK${NC}" return 0 else echo -e "${RED}FAILED${NC}" return 1 fi } status_service() { local device_id=$1 local device_name=$2 local protocol=$3 local script_path="$BASE_DIR/bin/$device_id.py" local pid=$(pgrep -f "${PYTHON_PATH}.*${script_path}" | head -1) if [[ -n "$pid" ]]; then echo -e "${GREEN}[RUNNING]${NC} $device_name ($device_id) - ${protocol} (PID: $pid)" return 0 else echo -e "${RED}[STOPPED]${NC} $device_name ($device_id) - ${protocol}" return 1 fi } cmd_start() { echo "=======================================" echo "启动 UPC Resent 服务" echo "=======================================" check_root echo "" local count=0 local device_id device_name protocol for ((i=0; i<${#DEVICES[@]}; i+=3)); do device_id="${DEVICES[i]}" device_name="${DEVICES[i+1]}" protocol="${DEVICES[i+2]}" if start_service "$device_id" "$device_name" "$protocol"; then ((count++)) fi done echo "" echo "=======================================" echo "启动完成: $count/$((${#DEVICES[@]}/3)) 个服务" echo "=======================================" } cmd_stop() { echo "=======================================" echo "停止 UPC Resent 服务" echo "=======================================" echo "" local count=0 local device_id device_name protocol for ((i=0; i<${#DEVICES[@]}; i+=3)); do device_id="${DEVICES[i]}" device_name="${DEVICES[i+1]}" protocol="${DEVICES[i+2]}" if stop_service "$device_id" "$device_name" "$protocol"; then ((count++)) fi done echo "" echo "=======================================" echo "停止完成: $count/$((${#DEVICES[@]}/3)) 个服务" echo "=======================================" } cmd_restart() { cmd_stop echo "" sleep 1 cmd_start } cmd_status() { echo "=======================================" echo "UPC Resent 服务状态" echo "=======================================" echo "" local running=0 local stopped=0 local device_id device_name protocol for ((i=0; i<${#DEVICES[@]}; i+=3)); do device_id="${DEVICES[i]}" device_name="${DEVICES[i+1]}" protocol="${DEVICES[i+2]}" if status_service "$device_id" "$device_name" "$protocol"; then ((running++)) else ((stopped++)) fi done echo "" echo "=======================================" echo "运行中: $running, 已停止: $stopped, 总计: $((${#DEVICES[@]}/3))" echo "=======================================" } # 主逻辑 case "${1:-}" in start) cmd_start ;; stop) cmd_stop ;; restart) cmd_restart ;; status) cmd_status ;; *) show_help exit 1 ;; esac