매일 아침 자동화 창에 빨간 에러가 세 줄씩 떴다. 그런데 업로드는 매번 성공했다. 결과물 손실 0.
그래서 아무도 안 봤다. 나도 안 봤다. “원래 그래”가 된 지 오래였다.
에러 내용이 명령이 아니라 주석이었다
어느 날 그 세 줄을 제대로 읽어봤다. 에러라고 뜬 문자열이 명령어가 아니라 한글 주석의 조각이었다. 주석은 실행되지 않아야 하는 글인데, 조각이 명령처럼 실행되다 죽고 있었다.
원인을 파보니 파일 자체가 아니라 줄바꿈 문자였다. 배치 파일이 유닉스식 줄바꿈(LF)으로 저장돼 있었다. 여기에 한글을 위한 UTF-8 설정이 겹치면, 명령 해석기가 줄의 경계를 잘못 잡는다. 그래서 주석 한 줄의 꼬리가 다음 명령으로 새어 나온 것이다.
실측으로 확정했다. LF판은 재현됐고, 윈도우식 줄바꿈(CRLF)으로 다시 저장하니 조용해졌다.
조용한 파일 여덟 개도 같은 지뢰였다
전수조사를 했다. 예약 작업 14개 중 13개가 LF로 저장돼 있었다. 그중 한글 주석이 없는 8개는 증상이 없었지만, 주석 한 줄만 추가되면 터지는 상태로 몇 달을 돌고 있었다. 증상이 없는 것과 지뢰가 없는 것은 다르다.
근본 원인은 습관이었다. 파일을 만드는 자리에 CRLF 강제가 없어서, 새 배치 파일이 계속 LF로 태어나고 있었다.
무해한 경보가 제일 위험했다
이 사건의 진짜 교훈은 줄바꿈이 아니다. 매일 뜨는 빨간 줄에 익숙해지면, 진짜 실패가 그 사이에 섞여도 구분하지 못한다. 무해한 경보는 무시할 대상이 아니라 없앨 대상이다.
재발방지 체크리스트
① 매일 나오는 에러는 “원래 그래”가 아니라 0으로 만든다. 경보 피로가 진짜 실패를 가린다.
② 윈도우 배치 파일은 CRLF. 파일을 만드는 자리에서 강제한다.
③ 원인은 재현판과 수정판의 비교 실측으로 확정한다.
④ 증상 없는 파일도 같은 지뢰를 품었는지 전수조사한다.
① 매일 나오는 에러는 “원래 그래”가 아니라 0으로 만든다. 경보 피로가 진짜 실패를 가린다.
② 윈도우 배치 파일은 CRLF. 파일을 만드는 자리에서 강제한다.
③ 원인은 재현판과 수정판의 비교 실측으로 확정한다.
④ 증상 없는 파일도 같은 지뢰를 품었는지 전수조사한다.