텔레그램 봇이 답을 안 한다, 프로세스는 멀쩡했는데
2026년 10월 2일, 텔레그램으로 블로그 작업을 넘기는 봇의 응답이 끊겼다. 운영 기록에 남은 원인은 텔레그램 메시지를 받아 세션에 넘기는 프로세스가 아니라, 브리지가 의존하는 herdr의 멈춤이었다.
대상은 텔레그램 봇을 에이전트 세션에 붙여 쓰다가 "프로세스는 살아 있는데 답장이 안 온다"는 상황을 만난 개발자다. 목표는 프로세스가 살아 있는지와 메시지가 실제로 오가는지를 따로 판정하는 것이다. 아래 내용은 10월 2일 내 환경 한 건의 기록이고, 같은 증상이 모두 herdr 때문이라는 뜻은 아니다.
기록된 증상과 복구
내 구성에서 텔레그램 메시지는 OpenClaw 플러그인과 게이트웨이를 거쳐 블로그 작업 세션으로 넘어간다. 세션 쪽에서 요청을 가져가는 프로세스를 여기서는 소비 프로세스라고 부른다. 이 브리지는 herdr에 의존한다.
10월 2일 응답이 끊겼을 때 herdr 창에는 다음 오류가 떠 있었다.
Failed to continue queued messages: Cannot continue from message role: assistant
herdr는 launchd 항목 sh.brew.herdr로 새 PID를 받아 다시 떴다. 그러자 텔레그램 응답도 바로 돌아왔고, 텔레그램 쪽에서 실제로 답장을 받는 것까지 확인했다.
기록에 없는 것도 분명히 해 둔다. herdr를 내가 다시 띄웠는지 launchd가 자동으로 다시 띄웠는지는 남기지 않았다. 응답이 언제부터 얼마나 끊겼는지도 기록에 없다. 위 오류 문자열이 정확히 무엇을 뜻하는지, herdr가 왜 멈췄는지도 이 기록으로는 알 수 없다.
살아 있는 PID가 말해 주지 않는 것
이 사고에서 남긴 교훈은 이렇다. 소비 PID가 살아 있고 ready.json과 consumer.lock이 그 PID를 가리키고 있어도 정상이라는 뜻은 아니다.
PID와 락 파일은 "소비 프로세스가 떠 있고 자기가 담당이라고 표시했다"는 것까지만 알려 준다. 메시지가 들어와서 답장으로 나가는 전체 왕복에는 그 프로세스가 의존하는 서버가 하나 더 끼어 있다. 그 서버가 멈추면 소비 프로세스가 멀쩡해도 답장은 나가지 않는다.
점검 순서
당시 기록에 정리한 연결 점검 기준은 세 가지다. 위에서부터 차례로 본다.
1. 마지막 답장 시각이 마지막 수신 시각보다 늦은가
답장 기록은 브리지의 data/notifications에 남는다. 마지막 수신보다 마지막 답장이 앞서 있으면, 받기는 했는데 답하지 못한 요청이 있다는 뜻으로 읽을 수 있다. 10월 2일의 실제 수신·답장 시각은 기록에 남기지 않아 여기 적지 않는다.
2. herdr 서버가 떠 있는가
기록에 점검 명령으로 남긴 것은 macOS launchd 목록 조회다.
launchctl list | grep herdr
내 환경의 항목 이름은 sh.brew.herdr였다. 다른 설치 방식이라면 항목 이름이 다를 수 있으니 자기 환경의 이름으로 찾자.
3. herdr 창에 오류가 표시돼 있지 않은가
서버가 목록에 떠 있다고 끝난 게 아니다. 10월 2일에는 herdr 창에 위의 Failed to continue queued messages 오류가 떠 있었다. 창을 직접 열어 오류 표시가 없는지 본다.
답장이 '오기는' 하는 경우와 구분
증상이 비슷해 보이지만 다른 경우가 있다. 텔레그램 답장으로 "요청 처리가 끝났지만 최종 답변을 확인하지 못했습니다…"가 온다면, 이것은 내 브리지 코드(session-bridge.mjs)가 보내는 대체 문구다. 기록은 이것을 연결 장애가 아니라고 정리했다. 그 턴이 글로 된 최종 답 없이 끝났다는 뜻이다.
이때는 herdr보다 요청별 상태 파일(data/state/<id>.json)의 answer 값과, 새로 생긴 초안 폴더나 작업 흔적을 먼저 본다. 아무 답장도 오지 않는 이번 사례와는 확인할 곳이 다르다.
이 기록이 답하지 않는 것
- herdr가 멈춘 이유와 오류 문자열의 의미
- 응답이 끊긴 시각과 지속 시간
- herdr가 다시 뜬 방식(수동인지 자동인지)
프로세스가 시스템 호출 단계에서 막혔다는 내용도 이 기록에는 없다. 기록이 가리킨 원인은 herdr 상태 하나다.
같이 보면 좋은 글
텔레그램 요청이 세션으로 들어가는 구조와 중복 실행을 막는 방법은 텔레그램 한 줄로 블로그 작업을 넘길 때 중복 실행을 막는 구조에 정리했다. 자동화 설정이 조용히 낡아 가는 문제를 점검하는 방법은 AI 코딩 설정도 코드처럼 썩는다 — 가짜 보안 훅과 죽은 에이전트 11개를 보면 된다.
결론: 프로세스 생존과 메시지 왕복은 따로 확인한다
10월 2일 텔레그램 응답이 끊겼을 때 기록된 원인은 소비 프로세스가 아니라 브리지가 의존하는 herdr의 멈춤이었다. 살아 있는 PID와 그 PID를 가리키는 락 파일은 정상을 보장하지 않았다. 그래서 기록에는 마지막 답장 시각, herdr 서버, herdr 창 오류를 차례로 보는 점검 기준을 남겼다.
댓글
댓글 쓰기