diff --git a/wechat_plain/scripts/local-testkit/keepalive.sh b/wechat_plain/scripts/local-testkit/keepalive.sh index a459b30..b27d4ad 100755 --- a/wechat_plain/scripts/local-testkit/keepalive.sh +++ b/wechat_plain/scripts/local-testkit/keepalive.sh @@ -22,9 +22,13 @@ export HOME="/data/data/com.termux/files/home" HERMES_DIR="${HERMES_DIR:-$HOME/hermes-wechat}" HERMES_PORT="${HERMES_PORT:-8642}" GATEWAY_START="${GATEWAY_START:-$HOME/.hermes/scripts/start-gateway.sh}" -AR_START="${AR_START:-$HERMES_DIR/start-ar.sh}" A11Y_SVC="com.hermes.wechat.xposed/com.hermes.wechat.xposed.accessibility.HermesAccessibilityService" CHECK_INTERVAL_SEC="${CHECK_INTERVAL_SEC:-15}" +# auto-reply 启动用的 env(避开 start-ar.sh 的 shell hook 污染) +MY_WXID="${MY_WXID:-wxid_51ap3m6p9xs722}" +MY_NICKNAME="${MY_NICKNAME:-小火子}" +HERMES_TIMEOUT_MS="${HERMES_TIMEOUT_MS:-180000}" +HISTORY_CONTEXT_SIZE="${HISTORY_CONTEXT_SIZE:-8}" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; } @@ -81,23 +85,45 @@ start_gateway() { } # ── 4. auto-reply.js ───────────────────────────────────────────── +AR_PID_FILE="$HERMES_DIR/.auto-reply.pid" + is_auto_reply_running() { - pgrep -f "node.*auto-reply.js" >/dev/null 2>&1 + # 不能用 pgrep -f node.*auto-reply.js — 它会自匹配 su shell 自己的 cmdline。 + # 用 ps -ef + grep 精确匹配 'node auto-reply.js'(含空格,排除 sh wrapper)。 + # su 提权因为 auto-reply 跑在 root 下,u0_a327 看不到 root 进程的 ps。 + # 用 . 占位(任何单字符)避开嵌套引号问题 + su -c "ps -ef 2>/dev/null | grep -E node.auto-reply.js | grep -v sh.-c | grep -v grep" \ + 2>/dev/null | grep -q . } start_auto_reply() { log "Starting auto-reply..." - if [ -x "$AR_START" ]; then - # auto-reply 走 root 才能 input keyevent / am broadcast / 读微信 DB - su -c "nohup bash $AR_START > /dev/null 2>&1 &" - else - log "[ERROR] $AR_START not found" + # 不走 start-ar.sh wrapper(其 shebang 走 dash 后会触发 phone 上某个 + # claude-run/hermes 会话的 shell snapshot hook,污染 hermes-wechat/*.js)。 + # 直接以 root 起 node + 内联 env,跨过那个 shell session。 + # 起完后用 pgrep + grep 严格匹配 cmdline 确切包含 'node auto-reply.js' + # (不能用 pgrep -f 因为正则 .* 会自匹配 su shell 本身),写入 PID 文件 + su -c "cd $HERMES_DIR && \ + MY_WXID=${MY_WXID:-wxid_51ap3m6p9xs722} \ + MY_NICKNAME=\"${MY_NICKNAME:-小火子}\" \ + HERMES_HOST=127.0.0.1 \ + HERMES_PORT=$HERMES_PORT \ + HERMES_TIMEOUT=${HERMES_TIMEOUT_MS:-180000} \ + NOTIFICATION_ENABLED=true \ + HISTORY_CONTEXT_SIZE=${HISTORY_CONTEXT_SIZE:-8} \ + nohup /data/data/com.termux/files/usr/bin/node auto-reply.js \ + > $HERMES_DIR/auto-reply.log 2>&1 < /dev/null & + echo \$! > $AR_PID_FILE" + sleep 2 + if [ -f "$AR_PID_FILE" ]; then + log "Auto-reply started PID=$(cat $AR_PID_FILE 2>/dev/null)" fi } # ── 5. 主循环 ──────────────────────────────────────────────────── log "=== Keepalive started ===" -log "HERMES_DIR=$HERMES_DIR GATEWAY_START=$GATEWAY_START AR_START=$AR_START" +log "HERMES_DIR=$HERMES_DIR GATEWAY_START=$GATEWAY_START" +log "MY_WXID=$MY_WXID MY_NICKNAME=$MY_NICKNAME HERMES_TIMEOUT=${HERMES_TIMEOUT_MS}ms" log "Check interval: ${CHECK_INTERVAL_SEC}s" # 首次进入:把所有依赖拉到位