#!/usr/bin/env bash # 一键用 screen 后台启动 3 个子代理(不含 OKX):Binance:15200、Gate:15202、Gate-Bot:15203 # 用法:在任意目录执行 bash /path/to/manual_trading_hub/scripts/start_agents_3screen.sh # 若 hub 单独在 /opt/manual_trading_hub,四个策略目录在别的路径,请先: # export MANUAL_TRADING_REPO_ROOT=/path/to/含_crypto_monitor_*_的目录 # 依赖:各策略目录已 cp .env.example .env 并配置;manual_trading_hub/.venv 已 pip install -r requirements.txt # 日志:manual_trading_hub/logs/<会话名>.log(若 screen 里进程秒退,tail 该文件排查) # 查看:screen -ls 接入:screen -r mt-agent-bn 停:./stop_agents_3screen.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" HUB_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" if [[ -n "${MANUAL_TRADING_REPO_ROOT:-}" ]]; then REPO_ROOT="$(cd "${MANUAL_TRADING_REPO_ROOT}" && pwd)" else REPO_ROOT="$(cd "${HUB_DIR}/.." && pwd)" fi AGENT_PY="${HUB_DIR}/agent.py" VENV_PY="${HUB_DIR}/.venv/bin/python" LOG_DIR="${HUB_DIR}/logs" mkdir -p "${LOG_DIR}" echo "REPO_ROOT=${REPO_ROOT} (其下应有 crypto_monitor_binance、crypto_monitor_gate 等目录)" if ! command -v screen >/dev/null 2>&1; then echo "未找到 screen,请先安装:sudo apt install screen" >&2 exit 1 fi if [[ ! -f "${VENV_PY}" ]]; then echo "未找到 ${VENV_PY},请先在 manual_trading_hub 下创建 venv 并 pip install -r requirements.txt" >&2 exit 1 fi if [[ ! -f "${AGENT_PY}" ]]; then echo "未找到 agent.py:${AGENT_PY}" >&2 exit 1 fi start_one() { local name="$1" subdir="$2" exchange="$3" port="$4" local work="${REPO_ROOT}/${subdir}" local logf="${LOG_DIR}/${name}.log" if [[ ! -d "${work}" ]]; then echo "目录不存在,跳过:${work}" >&2 echo " 若项目在别处,请设置 export MANUAL_TRADING_REPO_ROOT=/正确上级目录 后重跑" >&2 return 1 fi if screen -ls 2>/dev/null | grep -qF ".${name}"; then echo "已存在会话 ${name},跳过。要重建请先: screen -S ${name} -X quit" >&2 return 0 fi screen -dmS "${name}" bash -c " cd '${work}' || { echo 'cd failed' >>'${logf}'; exit 1; } # shellcheck source=lib_load_dotenv.sh source '${HUB_DIR}/scripts/lib_load_dotenv.sh' if [[ -f .env ]]; then load_dotenv_file .env >>'${logf}' 2>&1 || echo 'load .env failed' >>'${logf}' fi export EXCHANGE='${exchange}' PORT='${port}' HOST=127.0.0.1 exec '${VENV_PY}' '${AGENT_PY}' >>'${logf}' 2>&1 " sleep 0.5 if screen -ls 2>/dev/null | grep -qF ".${name}"; then echo "已启动 screen:${name} (${subdir} EXCHANGE=${exchange} PORT=${port}) 日志:${logf}" else echo "错误:${name} 启动后立刻退出。请执行: tail -80 '${logf}'" >&2 fi } start_one "mt-agent-bn" "crypto_monitor_binance" "binance" "15200" start_one "mt-agent-gate" "crypto_monitor_gate" "gate" "15202" start_one "mt-agent-gatebot" "crypto_monitor_gate_bot" "gate" "15203" echo "" echo "下一步(一键中控 screen):" echo " chmod +x ${SCRIPT_DIR}/start_hub_screen.sh && ${SCRIPT_DIR}/start_hub_screen.sh" echo "或手动:cd ${HUB_DIR} && source .venv/bin/activate && export HUB_AGENTS=... && python hub.py" echo "" echo "查看会话: screen -ls"