#!/usr/bin/env bash # 中控 + 子代理 统一 PM2 快捷脚本 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" HUB_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" ECO="${HUB_DIR}/ecosystem.config.cjs" # 与 ecosystem.config.cjs 中 name 一致 PM2_NAMES=( manual-agent-binance manual-agent-okx manual-agent-gate manual-agent-gate-bot manual-trading-hub ) usage() { cat <<'EOF' 用法: bash scripts/pm2_hub.sh start 启动 ecosystem.config.cjs(4 路子代理 + 中控,已存在则 restart 全部) stop 停止全部 restart 重启全部 status pm2 status logs 全部相关进程日志 delete 从 PM2 列表移除全部 仅中控: pm2 start ecosystem.config.cjs --only manual-trading-hub EOF } cmd="${1:-}" if ! command -v pm2 >/dev/null 2>&1; then echo "未找到 pm2,请先: npm install -g pm2" >&2 exit 1 fi if [[ ! -f "${ECO}" ]]; then echo "未找到 ${ECO}" >&2 exit 1 fi cd "${HUB_DIR}" _any_running() { local n for n in "${PM2_NAMES[@]}"; do if pm2 describe "${n}" >/dev/null 2>&1; then return 0 fi done return 1 } case "${cmd}" in start) if _any_running; then pm2 restart "${ECO}" echo "已重启:hub + 全部 agent" else pm2 start "${ECO}" echo "已启动:hub + 全部 agent(共 ${#PM2_NAMES[@]} 个进程)" fi pm2 save 2>/dev/null || true ;; stop) pm2 stop "${PM2_NAMES[@]}" 2>/dev/null || echo "部分或全部进程未在运行" ;; restart) if _any_running; then pm2 restart "${ECO}" else pm2 start "${ECO}" fi ;; status) pm2 status ;; logs) pm2 logs "${PM2_NAMES[@]}" --lines 100 ;; delete) pm2 delete "${PM2_NAMES[@]}" 2>/dev/null || echo "部分或全部进程不存在" ;; *) usage exit 1 ;; esac