운영 노트 80) 끝날 때까지 돌라고 했더니 604초를 태웠다
운영 노트

80) 끝날 때까지 돌라고 했더니 604초를 태웠다

2026.08.17

3D 작업을 자동으로 돌리는 스크립트를 짰다. 그중에 처리 순서를 맞추는 대목이 있었다. 특정 항목이 맨 앞에 올 때까지 한 칸씩 위로 올리는 작업.

그래서 이렇게 썼다. “맨 앞이 그것이 아니면, 위로 한 칸 올려라”를 반복. 사람 말로 옮기면 완벽하게 들린다.

화면 없이 돌리면 조용히 무시된다

그런데 이 작업을 화면 없이(헤드리스) 돌렸다. 그 환경에서는 “위로 올려라” 명령이 조용히 무력화된다. 에러도 없다. 그냥 아무 일도 일어나지 않는다.

결과는 예정된 것이었다. 순서는 안 바뀌고, 조건은 영원히 참이고, 반복은 끝나지 않는다.

기록에 남은 숫자가 이렇다. CPU 604초. 출력 파일 0바이트. 600초 제한에 걸려서야 강제로 끊겼다. 10분 동안 컴퓨터는 전력을 다해 아무것도 하지 않았다.

두 가지가 만나야 사고가 된다

이건 결함 하나가 아니라 둘이 겹쳐서 생긴 사고다. 하나는 “명령이 조용히 무력화된다”는 것. 다른 하나는 “그 명령의 결과를 반복을 멈출 조건으로 썼다”는 것.

둘 중 하나만 있었으면 그냥 실패로 끝났다. 무력화만 있었으면 순서가 안 맞는 채로 결과가 나왔을 것이고, 그건 눈에 보인다. 그런데 조건으로 쓰는 순간 멈출 방법이 사라졌다.

고친 방식은 세 가지

첫째, 그 명령을 안 쓰고 상태를 직접 다시 만들었다. 조용히 실패할 수 있는 것에 의존하지 않는다.

둘째, 모든 반복에 상한을 뒀다. 스무 번 돌았는데도 조건이 안 바뀌면, 그건 기다릴 일이 아니라 잘못된 일이다.

셋째, 검사 기준을 바꿨다. 제한 시간에 걸린 작업을 “느림”이 아니라 “무한 루프 의심”으로 기록한다. 느림으로 분류하면 다음에도 시간만 늘리고 넘어가게 된다.

재발방지 체크리스트
조용히 실패할 수 있는 명령의 결과를 반복 종료 조건으로 쓰지 않는다.
② 모든 반복에 횟수 상한을 둔다. 상한에 닿으면 기다리지 말고 실패로 끊는다.
③ 제한 시간 초과는 느림이 아니라 정지 불능 의심으로 분류한다. 시간만 늘리면 다음에 또 태운다.
④ 자동화 환경(화면 없음)에서 무력화되는 명령 목록을 따로 관리하고 쓰기 전에 대조한다.
본 사이트는 쿠팡 파트너스 및 알리익스프레스(AliExpress) 어필리에이트 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받을 수 있습니다.