中控增加下单,关键位,系统设置
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
# 检查四路子代理端口与 /status(在服务器上运行)
|
||||
set -e
|
||||
|
||||
check_one() {
|
||||
local name="$1" port="$2"
|
||||
echo "=== ${name} :${port} ==="
|
||||
if command -v ss >/dev/null 2>&1; then
|
||||
ss -tlnp 2>/dev/null | grep ":${port} " && echo " 端口: 已被占用" || echo " 端口: 空闲"
|
||||
fi
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
local body
|
||||
body=$(curl -sf --max-time 8 "http://127.0.0.1:${port}/status" 2>/dev/null) || {
|
||||
echo " /status: 无法连接(agent 未启动或崩溃)"
|
||||
return
|
||||
}
|
||||
echo " /status: ${body:0:200}"
|
||||
if echo "${body}" | grep -q '"ok":true'; then
|
||||
echo " 结果: OK"
|
||||
else
|
||||
echo " 结果: ok=false,见上 JSON"
|
||||
fi
|
||||
else
|
||||
echo " (未安装 curl,跳过 HTTP 检测)"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
check_one "binance" 15200
|
||||
check_one "okx" 15201
|
||||
check_one "gate" 15202
|
||||
check_one "gate_bot" 15203
|
||||
|
||||
echo "PM2 状态:"
|
||||
pm2 status 2>/dev/null | grep -E 'manual-agent|manual-trading' || true
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
# 去掉各目录 .env 的 Windows 换行符(解决 PM2 agent errored: $'\r': command not found)
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||
|
||||
dirs=(
|
||||
"${REPO}/manual_trading_hub"
|
||||
"${REPO}/crypto_monitor_binance"
|
||||
"${REPO}/crypto_monitor_okx"
|
||||
"${REPO}/crypto_monitor_gate"
|
||||
"${REPO}/crypto_monitor_gate_bot"
|
||||
)
|
||||
|
||||
fixed=0
|
||||
for d in "${dirs[@]}"; do
|
||||
f="${d}/.env"
|
||||
if [[ ! -f "${f}" ]]; then
|
||||
echo "跳过(无文件): ${f}"
|
||||
continue
|
||||
fi
|
||||
if grep -q $'\r' "${f}" 2>/dev/null; then
|
||||
sed -i 's/\r$//' "${f}"
|
||||
echo "已修复 CRLF: ${f}"
|
||||
fixed=$((fixed + 1))
|
||||
else
|
||||
echo "已是 LF: ${f}"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "完成,共修复 ${fixed} 个 .env。请执行: pm2 restart ecosystem.config.cjs"
|
||||
@@ -0,0 +1,16 @@
|
||||
# shellcheck shell=bash
|
||||
# 供 run_agent.sh / run_hub.sh source:加载 .env 并去掉 Windows CRLF($'\r')
|
||||
load_dotenv_file() {
|
||||
local f="$1"
|
||||
if [[ ! -f "${f}" ]]; then
|
||||
return 1
|
||||
fi
|
||||
set -a
|
||||
set +e
|
||||
# shellcheck disable=SC1090
|
||||
. <(sed 's/\r$//' "${f}")
|
||||
local rc=$?
|
||||
set -e
|
||||
set +a
|
||||
return "${rc}"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
# 仅重启失败的子代理(保留 hub / 已 online 的 agent)
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
HUB_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
ECO="${HUB_DIR}/ecosystem.config.cjs"
|
||||
|
||||
cd "${HUB_DIR}"
|
||||
chmod +x scripts/run_agent.sh scripts/run_hub.sh 2>/dev/null || true
|
||||
|
||||
AGENTS=(manual-agent-binance manual-agent-okx manual-agent-gate manual-agent-gate-bot)
|
||||
|
||||
for n in "${AGENTS[@]}"; do
|
||||
pm2 delete "${n}" 2>/dev/null || true
|
||||
done
|
||||
|
||||
pm2 start "${ECO}" --only manual-agent-binance
|
||||
pm2 start "${ECO}" --only manual-agent-gate
|
||||
pm2 start "${ECO}" --only manual-agent-gate-bot
|
||||
|
||||
# OKX 若已 online 可跳过;若也挂了则:
|
||||
# pm2 start "${ECO}" --only manual-agent-okx
|
||||
|
||||
pm2 save 2>/dev/null || true
|
||||
echo "已重建 binance / gate / gate-bot 子代理,请执行: bash scripts/check_agents.sh"
|
||||
@@ -4,10 +4,12 @@ set -e
|
||||
set -o pipefail
|
||||
|
||||
HUB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
# shellcheck source=lib_load_dotenv.sh
|
||||
source "${HUB_DIR}/scripts/lib_load_dotenv.sh"
|
||||
|
||||
VENV_PY="${HUB_DIR}/.venv/bin/python"
|
||||
AGENT_PY="${HUB_DIR}/agent.py"
|
||||
|
||||
# PM2 ecosystem 注入,须在 source .env 之后再次强制(避免 .env 覆盖 PORT/EXCHANGE)
|
||||
_PM2_EXCHANGE="${EXCHANGE:-}"
|
||||
_PM2_PORT="${PORT:-}"
|
||||
_PM2_HOST="${HOST:-}"
|
||||
@@ -18,10 +20,10 @@ if [[ ! -x "${VENV_PY}" ]]; then
|
||||
fi
|
||||
|
||||
if [[ -f .env ]]; then
|
||||
set -a
|
||||
# shellcheck disable=SC1091
|
||||
. ./.env
|
||||
set +a
|
||||
if ! load_dotenv_file ".env"; then
|
||||
echo "错误: $(pwd)/.env 加载失败" >&2
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "警告: $(pwd) 下无 .env,agent 可能缺少 API 密钥" >&2
|
||||
fi
|
||||
@@ -30,5 +32,12 @@ fi
|
||||
[[ -n "${_PM2_PORT}" ]] && export PORT="${_PM2_PORT}"
|
||||
[[ -n "${_PM2_HOST}" ]] && export HOST="${_PM2_HOST}"
|
||||
|
||||
if command -v ss >/dev/null 2>&1 && [[ -n "${PORT:-}" ]]; then
|
||||
if ss -tln 2>/dev/null | grep -q ":${PORT} "; then
|
||||
echo "错误: 端口 ${PORT} 已被占用,agent 无法监听(exchange=${EXCHANGE:-?})" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "agent start: exchange=${EXCHANGE:-?} port=${PORT:-?} cwd=$(pwd)" >&2
|
||||
exec "${VENV_PY}" "${AGENT_PY}"
|
||||
|
||||
@@ -1,21 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
# PM2 / 手动启动入口:加载 manual_trading_hub/.env 后运行 hub.py
|
||||
set -euo pipefail
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
HUB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "${HUB_DIR}"
|
||||
|
||||
# shellcheck source=lib_load_dotenv.sh
|
||||
source "${HUB_DIR}/scripts/lib_load_dotenv.sh"
|
||||
|
||||
VENV_PY="${HUB_DIR}/.venv/bin/python"
|
||||
if [[ ! -x "${VENV_PY}" ]]; then
|
||||
echo "未找到 ${VENV_PY},请先: python3 -m venv .venv && pip install -r requirements.txt" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
if [[ -f "${HUB_DIR}/.env" ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
. "${HUB_DIR}/.env"
|
||||
load_dotenv_file "${HUB_DIR}/.env" || {
|
||||
echo "错误: ${HUB_DIR}/.env 加载失败" >&2
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
set +a
|
||||
|
||||
exec "${VENV_PY}" "${HUB_DIR}/hub.py"
|
||||
|
||||
Reference in New Issue
Block a user