virtual-insanity
← 리포트 목록

텔레그램 봇 무응답 진단 + 복구

2026-04-15 telegram [telegram, bot, diagnose, infra]

텔레그램 봇 무응답 진단 + 복구

결론

완전 복구 판정은 못 냈다. 핵심 원인은 3개다.

  1. @openclaw_harybot은 현재 수신 불가 상태다. com.openclaw.claude-listener 프로세스는 살아 있지만 2026-04-15 12:31 KST에도 HTTP 409 Conflict가 반복된다. 같은 토큰을 다른 인스턴스가 getUpdates로 polling 중이라는 뜻이다.
  2. @ronclawBot은 프로세스와 Telegram TCP 연결은 살아 있다. 다만 claude-to-im doctor는 Codex 샌드박스의 ps/DNS 제한 때문에 token/PID 검증을 실패로 냈다. 관리용 PID 파일이 틀려 있어 1235로 정정했다.
  3. @RONforMAC_Bot/Hermes 경로는 PID 41269가 살아 있고 Telegram TCP 연결도 있다. 다만 gateway.loggetUpdates 200 OK가 12:14:56 이후 멈췄고, 12:15에 들어온 Hermes agent 작업 이후 polling 로그가 재개되지 않았다. Hermes Gateway는 죽이지 않았다.

Codex 실행 샌드박스에서 api.telegram.org DNS와 launchctl kickstart가 막혀 있어, 직접 API getMe/라이브 ping/launchd 재시작은 완료하지 못했다. 대신 로컬 launchd/lsof/log/DB 근거로 상태를 판정했다.

봇별 상태 표

토큰 유효 프로세스 alive 최근 활동 진단 복구조치 최종상태
@openclaw_harybot 유효 추정: 409는 인증 통과 후 polling 충돌 com.openclaw.claude-listener pid 66858 2026-04-15 12:31:43/51/59HTTP 409 Conflict 반복 현재 수신 불가. 동일 봇 토큰의 다른 poller가 있음. 또 코드가 DM이 아니라 collab_chat_id=-1003522748967만 처리함 launchctl kickstart 시도 → Operation not permitted. 코드/토큰 변경은 하지 않음 ❌ 미복구. 중복 poller 제거 또는 토큰 재발급 필요
@ronclawBot 유효 추정: 과거 409와 현재 Telegram TCP 연결 com.claude-to-im.bridge pid 1235 로그 마지막 오류 2026-04-15 03:49:23 fetch failed; 현재 149.154.166.110:443 ESTABLISHED Codex 직접 연결은 살아 있는 쪽에 가깝다. 예전 409는 disabled된 codex_telegram_listener와 충돌했던 것으로 보이며 현재 해당 launchd 서비스는 로드되어 있지 않음 /Users/ron/.claude-to-im/runtime/bridge.pid를 stale 17321235로 정정, 백업 생성 ⚠️ 부분 복구. 실제 Harry DM round-trip은 샌드박스 DNS 제한 때문에 미검증
@RONforMAC_Bot 유효 확인: Hermes 로그에 getUpdates 200 OK 다수 ✅ Hermes Gateway pid 41269, 127.0.0.1:18789 LISTEN, Telegram TCP ESTABLISHED 2026-04-15 12:14:56까지 getUpdates 200 OK, 이후 session flush만 있음 송신/수신 기반은 살아 있으나 polling 로그가 12:15 이후 멈춤. Gateway 장시간 agent 작업 또는 polling loop 정체 가능성 채널 설정 변경 없음. Gateway kill/restart 안 함. live ping 시도는 network request 실패 ⚠️ 부분 장애 의심. Gateway Telegram polling 재확인 필요

확인한 구조

토큰/설정 위치

  • ~/.openclaw/bot_tokens.json
  • claude.bot_username=openclaw_harybot, token 83820953…GkLw
  • codex.bot_username=ronclawBot, token 84231387…WFCU
  • claude_bridge.bot_username=ronbridgebot, token 87122366…I__U
  • collab_chat_id=-1003522748967
  • ~/.hermes/.env
  • TELEGRAM_BOT_TOKEN=85485086…b0xo
  • TELEGRAM_ALLOWED_USERS=492860021,976052688
  • ~/.claude-to-im/config.env
  • CTI_TG_BOT_TOKEN=84231387…WFCU
  • CTI_TG_CHAT_ID=492860021

프로세스/launchd

  • com.openclaw.claude-listener
  • /usr/bin/python3 -u ~/.openclaw/workspace/scripts/claude_telegram_listener.py
  • running, pid 66858
  • com.claude-to-im.bridge
  • /usr/local/bin/node ~/.codex/skills/claude-to-im/dist/daemon.mjs
  • running, pid 1235
  • ai.hermes.gateway
  • launchd에는 enabled로 보이나 launchctl print gui/501/ai.hermes.gateway는 service not found
  • 실제 foreground/수동 프로세스로 pid 41269127.0.0.1:18789 LISTEN
  • com.openclaw.codex-telegram-listener
  • disabled / 현재 launchd service not found
  • com.claude-to-im.bridge-claude
  • enabled지만 not running, token은 ronbridgebot용으로 이번 3개 대상 아님

구체적 문제

1) @openclaw_harybot — 409 Conflict 현재진행형

근거:

  • 로그: /Users/ron/.openclaw/logs/claude-listener.err
  • 최신 tail:
  • 2026-04-15 12:31:43,856 [claude-listener] WARNING 폴링 실패: HTTP Error 409: Conflict
  • 2026-04-15 12:31:51,590 ... 409
  • 2026-04-15 12:31:59,231 ... 409
  • 프로세스는 살아 있음: launchctl pid 66858
  • lsof: pid 66858149.154.166.110:443에 ESTABLISHED

판정: 로컬 프로세스는 Telegram에 접속하고 있으나, Telegram 서버가 다른 getUpdates 요청에 의해 종료시킨다. 로컬에서 확인 가능한 중복 launchd 서비스는 없어서, 다른 세션/원격/수동 실행 poller가 같은 @openclaw_harybot 토큰을 잡고 있을 가능성이 높다.

추가 구조 문제:

  • claude_telegram_listener.py는 현재 DM이 아니라 협업방만 처리한다.
  • 코드 조건: if chat_id != get_collab_chat_id(): continue
  • CLAUDE.md 기준은 해리 DM | @openclaw_harybot이므로 현재 동작과 기준 문서가 불일치한다.

2) @ronclawBot — 직접 연결은 살아 있으나 관리 상태 불일치

근거:

  • launchctl: com.claude-to-im.bridge running pid 1235
  • lsof: pid 1235149.154.166.110:443에 ESTABLISHED
  • 이전 409 로그는 2026-04-14 14:46 KST 부근까지 반복 후 SIGTERM. 현재 com.openclaw.codex-telegram-listener는 disabled/service not found라 같은 로컬 중복은 보이지 않음.
  • claude-to-im doctor:
  • PID file stale 실패
  • Telegram getMe 실패는 Codex 샌드박스 DNS 제한과 동일 증상

조치:

  • /Users/ron/.claude-to-im/runtime/bridge.pid1732에서 실제 launchd pid 1235로 정정.
  • 백업: /Users/ron/.claude-to-im/runtime/bridge.pid.bak-20260415_123331

3) @RONforMAC_Bot / Hermes Gateway — polling 정체 의심

근거:

  • lsof: pid 41269127.0.0.1:18789 LISTEN, Telegram 149.154.166.110:443 ESTABLISHED
  • /Users/ron/.hermes/logs/gateway.log:
  • 11:35~12:14까지 POST .../getUpdates "HTTP/1.1 200 OK"가 10초 간격으로 반복
  • 12:15 agent 실행 이후 getUpdates 로그가 끊기고, 12:18/12:23/12:28 session flush만 기록
  • /Users/ron/.hermes/channel_directory.json 최신 갱신: 2026-04-15T12:31:39, Telegram DM 492860021 인식

판정: Gateway 자체는 살아 있으나 Telegram polling loop가 12:15 이후 정상 주기로 로그를 남기지 않는다. Gateway를 죽이지 말라는 지시가 있어 재시작하지 않았다.

API/getMe / webhook / ping 테스트

Codex shell에서 직접 API 확인은 네트워크 제한으로 실패했다.

  • getMe, getWebhookInfo: URLError(gaierror(8, 'nodename nor servname provided, or not known'))
  • api.telegram.org DNS/TLS: 동일 DNS 실패
  • curl http://127.0.0.1:18789/v1/health: sandbox에서 연결 실패. 단, lsof는 pid 41269 LISTEN 확인.
  • openclaw message send --channel telegram --target 492860021 ...: Network request for 'sendMessage' failed!

따라서 이번 세션에서 실제 Telegram 메시지 왕복 성공은 확인하지 못했다. 다만 host 프로세스 자체는 Telegram IP로 직접 연결되어 있어, 이 실패는 Codex 실행환경의 네트워크 제한과 별개일 가능성이 크다.

큐/연쇄 영향

~/.openclaw/data/ops_multiagent.db 확인:

  • bus_commands: queued=4, claimed=1, done=17, failed=6
  • 최근 queued에는 drift-recovery/KPI/codex 작업이 남아 있음.
  • notification_center_log에는 Telegram 발송 실패가 보임:
  • raw_error=<urlopen error [Errno 8] nodename nor servname provided, or not known>
  • quiet_hours로 차단된 정상 억제도 있음.

추가로 ~/.openclaw/workspace/telegram-outbox1172개 파일이 남아 있다. 알림 발송 실패 누적이 크며, 봇 응답 장애와 별개로 송신 backlog도 정리 대상이다.

적용한 복구 조치

  1. 토큰/프로세스 매핑 완료. 토큰은 전부 마스킹 기록.
  2. @ronclawBot의 stale PID 파일 정정.
  3. 변경: /Users/ron/.claude-to-im/runtime/bridge.pid
  4. 이전값 백업: /Users/ron/.claude-to-im/runtime/bridge.pid.bak-20260415_123331
  5. 새 값: 1235
  6. launchctl kickstart -k로 아래 둘 재기동 시도:
  7. com.claude-to-im.bridge
  8. com.openclaw.claude-listener
  9. 둘 다 Operation not permitted로 실패. 프로세스는 기존 PID로 계속 running.
  10. @RONforMAC_Bot 채널 설정은 변경하지 않음.
  11. Hermes Gateway pid 41269는 지시대로 죽이지 않음.

잔존 이슈 / 다음 조치

  1. @openclaw_harybot 409 해결이 최우선.
  2. 로컬에서 보이는 중복 launchd는 없음.
  3. 다른 터미널/원격/과거 세션에서 같은 83820953…GkLw 토큰으로 getUpdates 중인 프로세스를 찾아 중지해야 한다.
  4. 못 찾으면 BotFather에서 @openclaw_harybot 토큰 재발급 후 ~/.openclaw/bot_tokens.json 갱신이 가장 확실하다.
  5. @openclaw_harybot DM 라우팅 불일치 수정 필요.
  6. 현재 코드는 협업방만 처리한다.
  7. 해리 DM에서 답하게 하려면 claude_telegram_listener.pychat_id == 492860021도 처리하고, 응답도 같은 DM으로 보내도록 수정해야 한다.
  8. Hermes Gateway Telegram polling 정체 재확인 필요.
  9. 12:15 이후 getUpdates 로그가 멈췄다.
  10. Gateway를 재시작하려면 별도 명시 지시가 필요하다. 현재 지시상 PID 41269는 유지했다.
  11. 텔레그램 outbox 1172건 정리 필요.
  12. 실패 누적이 매우 크다.
  13. 이번 작업 범위에서는 삭제/재발송하지 않았다.
  14. Codex 샌드박스 네트워크 제한 때문에 live ping/getMe가 불가.
  15. 실제 host 터미널에서는 아래 확인이 필요하다: bash curl -s "https://api.telegram.org/bot<TOKEN>/getMe" launchctl kickstart -k gui/501/com.claude-to-im.bridge launchctl kickstart -k gui/501/com.openclaw.claude-listener

자체평가

  • 정확성: 4/5 — 파일·launchd·lsof·로그·DB 근거로 장애 원인을 특정했다. 단 live API는 환경 제한으로 미확인.
  • 완성도: 3.5/5 — @ronclawBot 관리 상태는 일부 정정했지만, @openclaw_harybot 409와 Hermes polling 정체는 이 세션 권한으로 복구 못 했다.
  • 검증: 3.5/5 — launchctl/lsof/log/doctor/DB 검증 완료. 실제 Telegram round-trip은 실패.
  • 최소 변경: 5/5 — PID 파일 1개만 백업 후 정정. 봇 토큰/채널/Hermes Gateway/코드는 변경하지 않음.

종합: 4.0/5