조용히 멈춘 cron 탐지하기 — 자동화에 데드맨 스위치 달기
cron이 조용히 멈추면 에러도 알림도 안 남아요. 자동화 루프에 데드맨 스위치를 붙여 조용한 멈춤을 탐지하는 방법을 직접 해본 경험으로 정리했어요.
조용히 멈춘 cron 탐지하기 — 자동화에 데드맨 스위치 달기
자동화를 하나둘 늘리다 보니 정작 무서운 건 요란한 에러가 아니더라고요. 에러는 알림이라도 와요. 진짜 위험한 건 cron이 조용히 멈춰서 성공도 실패도 안 남는 경우예요. 저도 한 번은 밤사이 멈춘 걸 몇 시간 지나서야 알아챘어요. 혹시 비슷한 적 없나요?
성공 로그가 초록불이어도 안심할 순 없어요
status=success와 실제로 돌았다는 건 다른 얘기예요. 게시 여부 같은 표면 체크(surface check)는 "돌긴 했는데 결과가 틀린" 가짜 초록불은 잡아줘요. 그런데 "루프가 아예 안 돈" 경우는 못 잡아요. cron 스케줄이 안 떴거나 프로세스가 죽으면 성공도 실패도 기록되지 않으니까요. 이 둘은 서로 다른 실패 모드라, 하나로 둘 다 대신할 수 없어요.
데드맨 스위치의 원리
심박(heartbeat)을 기대하는 쪽을 따로 두는 거예요. 루프가 한 번 제대로 끝날 때마다 타임스탬프 파일 1개에 시각을 찍어둬요. 그리고 그 루프 바깥에서, 완전히 다른 경로가 이 파일을 감시해요. 정해둔 시간(예: 30분)을 넘겨도 갱신이 없으면 알림을 쏘고요.
핵심은 "바깥에서"예요. 감시 코드가 같은 루프 안에 있으면 루프가 죽을 때 감시도 같이 죽어요. 그러면 아무도 안 남죠.
붙여 보니 생각보다 간단했어요
직접 붙여 보니 핵심 로직은 코드 3줄이면 끝이더라고요. 포인트는 성공 판정을 통과한 뒤에만 시각을 찍는 거예요. 아무 때나 찍으면 "돌긴 했는데 틀린" 경우까지 살아있는 걸로 착각해요.
- 루프 성공 직후: 타임스탬프에 현재 UTC 시각 기록
- 별도 스케줄(예: 5분 간격): 지금 시각에서 마지막 성공 시각을 뺀 값이 임계를 넘으면 알림
- 알림은 감시 대상 워크플로우와 무관한 채널로 보내기
- 외부 경로
- 성공 후에만 기록
- 임계 시간 명시
흔한 함정 두 개
하나는 타임존이에요. cron이 도는 서버 시각과 내가 생각하는 한국 시간이 다르면 임계 계산이 어긋나요. 저장은 UTC로 통일하고 표시할 때만 변환하는 편이 마음 편했어요.
둘은 표면 체크와 헷갈리지 않기예요. 데드맨은 "살아 있나"를 보고, 표면 체크는 "제대로 했나"를 봐요. 돌려 보니 이 둘을 각각 두었을 때 비로소 사각지대가 줄었어요.
마무리
라이프케어로그를 혼자 운영하면서 느낀 건, 자동화가 늘수록 조용한 멈춤을 잡는 장치가 먼저라는 점이에요. 플랜씨(plan-c) 계산기나 플랜엘(plan-l) 뒤에서 도는 작은 배치일수록 그래요. 데드맨 스위치는 자동화를 하나 더 얹는 게 아니라, 이미 있는 자동화가 죽었는지 알려주는 안전장치예요. 오늘 도는 cron 하나에 먼저 붙여 보세요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.