크론 작업 모니터링
예약된 작업이 중단되는 순간을 즉시 파악하세요. 백업, 큐 작업, ETL 작업, 시간별 동기화까지 모두 조용히 감시합니다.
예약된 작업의 문제
cron의 무서운 특징은 중단되어도 아무도 알려주지 않는다는 점입니다. 웹 애플리케이션은 여전히 요청을 서비스하고, 메인 페이지도 정상적이며, 모니터링 상태도 초록불입니다. 하지만 어딘가 서버에서 야간 백업이 2주째 실행되지 않았습니다. 배포 이후 큐 워커가 죽어서 대기 중인 작업이 쌓이고 있습니다. 시간마다 동기화 작업은 권한 문제로 묵묵히 행을 놓치고 있습니다. 이런 상황은 결국 다운스트림에서 무언가가 고장났을 때만 알게 됩니다. — 보통은 정말 그 기능이 가장 필요할 때죠. 데이터 팀은 내보내기를 요구하고, 지원팀은 메일 큐를, 운영팀은 백업을 원합니다. 그때는 이미 늦었습니다.
표준적 가용성 모니터링은 이를 잡아내지 못합니다. 핑을 보낼 엔드포인트가 존재하지 않기 때문입니다. Cron은 HTTP 엔드포인트를 노출하지 않고, 포트도 열지 않으며, 서버를 실행하지 않습니다. 실행되었다가, 완료되고, 종료됩니다. 만약 멈춘다면—그 부재를 알리는 신호가 전혀 없습니다. 당신이 탐색을 시작할 때까지는요.
역방향 패턴: 하트비트 모니터링
하트비트 모니터링(‘dead man’s switch’ 또는 ‘cron 모니터링’라고도 불림)은 방향을 반대로 전환합니다. 우리가 당신의 서비스를 점검하는 대신, 당신의 서비스가 우리 시스템에 신호를 보냅니다. 크론에 한 줄만 추가하세요 — 저희가 생성한 고유 URL로 curl을 실행합니다. 이 URL은 매번 호출될 때마다 타임스탬프를 기록합니다. 우리는 이 ping의 부재만을 주시합니다. 만약 URL이 기대한 간격(여유 포함) 내에 호출되지 않으면 생략된 실행으로 간주하고 경고를 발송합니다.
이 모델은 간단하고 신뢰성 높으며 언어에 독립적입니다. HTTP 요청을 할 수 있다면 어느 것이든 연동 가능합니다. Bash에서는 curl, Python에서는 requests, Node에서는 fetch, PHP는 curl_init, Windows 작업 스케줄러는 Invoke-WebRequest, GitHub Actions, Kubernetes CronJob, Lambda 예약 이벤트 등 모두 지원합니다. 별도의 SDK, 에이전트, 데몬 설치가 필요하지 않습니다.
설정 방법
DiagnoSEO Uptime Monitoring에서 "모니터 추가"를 클릭하고 유형으로 "하트비트 / cron"을 선택하세요. 도구가 토큰이 포함된 고유 URL을 생성합니다. 예시: https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9. 기대하는 인터벌(작업이 몇 분마다 실행되는지)과 여유시간(얼마나 늦어도 괜찮은지)를 설정하고 저장하세요.
이제 크론을 수정해 매 성공적인 실행 후 URL로 ping을 전송하게 하세요. 환경에 따라 스타일은 세 가지입니다:
# Bash cron - 성공시에만 ping 전송
0 3 * * * /usr/bin/backup.sh && curl -fsS https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9 > /dev/null
# 또는 부분적 성공도 허용한다면
0 3 * * * /usr/bin/backup.sh; curl -fsS https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9 > /dev/null
# Python
import requests
def main():
do_the_work()
requests.get('https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9', timeout=5)
# GitHub Actions
- name: Notify heartbeat
if: success()
run: curl -fsS https://app.diagnoseo.com/tools/uptime-monitoring/hb.php?t=abc123xyz9
이 순간부터는 모든 성공한 실행이 저희 시스템에 ping 신호를 보내고, 저희가 타임스탬프를 기록합니다. 만약 인터벌 + 여유시간분 안에 ping이 감지되지 않으면, 인시던트가 개시되고 Email, Telegram, Slack, Discord, SMS 등 모든 활성화된 채널로 알림이 전송됩니다.
인터벌 및 여유시간(마진) 선택
인터벌은 작업 스케줄에 정확히 맞추어야 합니다. 3시에 실행되는 야간 백업이면 1440분(24시간) 인터벌, 시간마다 동기화라면 60, 5분마다 폴링하는 워커는 5로 설정합니다.
여유시간은 자연스러운 지터(jitter)를 흡수합니다. 크론은 정확히 나노초 단위로 실행되지 않고, 대기열에 대기하거나 이전 실행이 끝나기를 기다리거나, 일시적인 오류로 인해 백오프(back-off)할 수도 있습니다. 24시간 작업에 1시간 여유를 두면 경고 지연 없이 넉넉한 완충 역할을 하며, 5분마다 폴링하는 워커는 2분 마진으로 진짜 다운에 빠르게 대응하면서 30초 미만의 단기 오류에는 잘못된 경고가 뜨지 않습니다. 대략적으로, 작업이 얼마나 흔들리는지에 따라 마진을 인터벌의 10~50%로 설정하세요.
추천하는 패턴들
- 성공시에만 ping 전송. bash에서는
&&를 사용하세요 — 실패한 작업은 ping을 보내지 않습니다. 저희가 ping의 부재를 감지해 경고합니다. - 반복 루프의 매 번 성공마다 ping. 오래 실행하는 워커라면 각 작업 단위가 성공할 때마다 루프 내부에서 ping을 해야 합니다. 이렇게 하면 멈춘 워커도 실행 중간에 감지할 수 있습니다.
- 논리적 작업에 하트비트 하나 — 스크립트마다 아님. 세 개의 스크립트가 하나의 야간 파이프라인을 이룬다면, 체인 마지막에 한 번만 ping하세요. 이렇게 하면 "파이프라인이 살아있는지" 명확한 신호가 됩니다.
- 로그와 결합. 하트비트는 작업이 수행되었음을 뜻합니다. 애플리케이션 로그는 무엇을 실행했는지 설명합니다. 둘이 함께 전체 그림을 완성합니다.
하트비트가 사라질 때
마감 시간에 도달하는 순간 인시던트가 시작됩니다. 대시보드에는 "X분째 하트비트 없음" 오류와 함께 모니터가 빨간색 상태로 표시됩니다. 모든 활성화된 채널로 알림이 발송됩니다. 새로운 하트비트가 도착하면 모니터는 자동으로 정상으로 복구되며, 인시던트가 닫힙니다. (복구 알림을 켠 경우 "다시 온라인됨" 알림도 자동 수신합니다.)
이 모든 과정은 다른 모니터와 동일하게 취급됩니다 — 히트맵, 가동률, 기록, 태그, 검색, 내보내기 등. 대시보드 관점에서는 하트비트 모니터도 HTTP, ping, port, API와 나란히 정렬 및 필터링되는 하나의 행일 뿐입니다.
체크리스트
모니터 추가 → Heartbeat 유형 선택 → 생성된 URL 복사 → cron/워커/스케줄러에 추가 → 인터벌 및 마진 설정 → 저장 → 완료! 이제 예약된 작업이 멈추자마자 몇 초 만에 알게 되어, 장기적으로는 모니터링 관련 의사결정 가운데 가장 중요한 선택 중 하나를 하게 됩니다.
자주 묻는 질문
-
역방향 모니터링 — 예약된 작업이 성공적으로 실행될 때 저희 URL에 ping을 보냅니다. 정해진 시간 내에 신호가 오지 않으면 경고를 보냅니다. 조용한 고장을 잡아냅니다: 고장난 크론 작업은 오류 없이 감지되지 않고, 기존 uptime 모니터로도 경고가 발생하지 않습니다.
-
크론 명령어 끝에
curl -fsS <heartbeat_url>을 추가하세요. 앞의 작업이 실패하면 curl이 실행되지 않아 하트비트가 생략됩니다. 또는 시작과 끝에 각각 다른 ping을 보내면 "시작됨", "완료됨" 신호를 따로 보낼 수도 있습니다. -
평균 작업 소요 시간의 2~3배 정도로 잡으세요. 예를 들어 일일 백업이 30분 걸린다면 여유 기간을 90분으로 설정하세요 — 느려져도 거짓 알람 없이 안전합니다. 실행 시간이 들쑥날쑥한 작업은 넉넉하게 잡고 대시보드로 특이값을 식별하세요.
-
가능합니다 — 인터벌을 맞춤 설정하세요(예: 60분마다, 여유기간 15분). 모니터는 최소 75분마다 한 번 ping이 오기를 기대합니다. 실행 주기가 더 짧아도(5분마다 등), 하트비트 URL이 대응하므로 원하는 인터벌로 설정하면 됩니다.
-
네, 가능합니다. Lambda 함수의 끝에 하트비트 URL로 HTTP 호출을 추가하세요. 모니터는 크론 하트비트와 동일하게 다룹니다 — 경고, 여유 시간 처리 모두 같습니다. 예약된 Lambda에서 CloudWatch 경고로 잡지 못하는 조용한 장애 감지에 특히 유용합니다.
UptimeRobot · Pingdom · BetterStack · Oh Dear · Site24x7 · StatusCake · Sentry · Uptrends · Cronitor · New Relic