← 뉴스레터

2026-07-22

감시견은 2초마다 비명을 지르고 있었다

다른 사고를 조사하려고 시스템 일지를 열었다가 이상한 걸 봤다. 같은 메시지가 2초 간격으로 끝없이 이어져 있었다. “끊어진 파이프.” 세어 보니 13만 줄이 넘었다 — 정확히는 130,152줄. 감시 스크립트 하나가 며칠 동안 2초마다 한 번씩 비명을 지르고 있었던 것이다. 감시견은 제 할 일을 다 하고 있었다. 다만 일할 때마다 비명을 질렀을 뿐이다.

내 자동화에는 작은 파수꾼이 하나 있다. 터미널 안에 AI 세션이 살아 있는지 2초마다 들여다보고, 죽어 있으면 살려내는 감시 스크립트다. 단순하고 성실한 코드다. 문제는 그 성실함이 며칠째 시스템 일지를 쓰레기장으로 만들고 있었다는 것이다.

수도꼭지를 너무 일찍 잠갔다

원인을 따라가 보니, 막히는 지점은 언제나 그렇듯 단순했다.

감시 스크립트는 살아 있는 세션 목록을 뽑은 다음, “하나라도 있나”만 알면 됐다. 그래서 목록에서 첫 줄만 받아오는 도구에 연결해 뒀다. 첫 줄만 받으면 되니까 효율적으로 보인다.

그런데 첫 줄만 받는 도구는 첫 줄을 받는 순간 파이프를 잠가 버린다. 앞사람이 물을 흘려보내는데 뒷사람이 첫 컵만 받고 수도꼭지째 잠그는 셈이다. 앞사람이 둘째 컵을 부으려는 순간, 물길이 끊겼다는 비명이 터진다. 그게 시스템 일지에 찍히던 “끊어진 파이프”였다.

그래서 이 버그에는 발병 조건이 있었다. 세션이 하나뿐이면 둘째 줄이 없으니 아무 일도 없다. 세션이 둘이 되는 순간부터, 2초마다 한 번씩 비명이 쌓인다. 하루면 4만 줄이 넘는다.

수리는 한 줄이었다. 첫 줄만 받지 말고 목록 전체를 받아서 비었는지 본다. 끝. 며칠을 쌓인 13만 줄의 근본 원인이, 고치고 나니 한 줄이었다.

고치는 길에 함정이 두 개 더 있었다

한 줄 수리를 배포하는 길에서 사고와 함정을 하나씩 더 만났다.

첫째, 배포 자체가 사고를 냈던 흔적이 나왔다. 예전 배포에서 감시 스크립트 파일을 덮어쓰는 도중, 반쯤 쓰인 파일이 그대로 실행된 적이 있었다. 문법이 맞을 리 없으니 감시견이 그 자리에서 즉사했다. 그래서 이번에는 배포 방식부터 바꿨다. 옆자리에 새 파일을 다 써 놓고, 문법 검사를 통과한 경우에만 한 번에 바꿔치기한다. 쓰다 만 파일이 실행될 틈 자체를 없애는 방식이다.

둘째, 파일을 갈아도 끝이 아니었다. 실행 중인 프로세스는 옛 파일을 문 채로 계속 돈다. 새 파일을 곱게 놓아두기만 하면 “파일은 새것, 실행은 헌것”인 상태가 된다. 겉보기엔 배포 완료인데 비명은 계속되는, 고쳤다는 착각만 남는 상태다. 재기동까지 해야 수리가 실행에 도달한다. 실제로 한 기계에서 재기동 표시를 빼먹기 쉬운 경로가 발견돼, 잔여 기계들에 “이 표시 없이 배포하면 수리 무효”라는 경고를 함께 돌렸다.

조용한 기계가 더 무서웠다

같은 감시 스크립트는 여러 기계에서 돈다. 비명을 지른 건 데스크탑 한 대였고, 나머지는 일지가 깨끗했다. 그럼 나머지는 무사한 걸까.

열어 보니 아니었다. 코드 결함은 그대로 있었다. 조용했던 이유는 단 하나, 그 기계들엔 세션이 하나뿐이라 발병 조건이 안 갖춰졌기 때문이다. 세션이 둘이 되는 순간 즉시 비명이 시작될, 잠복 환자였다.

조용하다는 이유로 재배포 대상에서 빼면 안 된다 — 이번 수리에서 제일 오래 남을 문장이다. 증상 없는 기계와 다 나은 기계는 다르다. 판별 기준은 일지가 아니라 코드다.

비명을 지르던 기계와 잠복 환자로 확인된 기계부터 차례로 재배포와 재기동을 마치고 실측했다. 비명 0줄. 이번에는 결함도 0인 채로의 0줄이다. 남은 기계들도 같은 순서로 돈다.

배운 것

버그는 조건이 갖춰질 때만 운다. 안 우는 기계를 나은 기계로 착각하면, 잠복 환자를 병동에 그대로 두게 된다. 완치 판정은 증상이 아니라 코드를 열어서 내려야 한다.

로그 스팸은 소음이 아니라 신호다. 13만 번 반복된 메시지는 13만 번 무시된 보고서다. 같은 줄이 두 번 찍히기 시작한 시점에 봤다면 이 이야기는 두 줄짜리로 끝났다.

그리고 고침의 완성은 파일 교체가 아니라 실행 교체다. 저장소가 새것이어도, 디스크가 새것이어도, 돌고 있는 프로세스가 헌것이면 현장은 헌것이다.


안 우는 개와 다 나은 개는 다르다.

— 강대종 / @ssamssae