머리를 아프게 하지 않고 Cron Jobs 자동화하기 (구문 추측을 멈추세요)
Source: Dev.to
우리는 모두 그런 경험을 해봤습니다.
데이터베이스를 정리하는 멋진 Python 스크립트나 로그를 회전시키는 중요한 Bash 스크립트를 방금 완성했습니다. 힘든 작업은 끝났고, 이제 매주 화요일 새벽 3시 15분에 자동으로 실행되기만 하면 됩니다.
crontab -e를 입력합니다. 터미널이 열리고 깜박이는 커서를 바라봅니다.
# Edit this file to introduce tasks to be run by cron.
#
# m h dom mon dow command
* * * * * _
갑자기 머리가 멈춥니다.
Wait. Is Sunday 0 or 7? → 잠깐. 일요일은 0인가요, 7인가요?
Which asterisk is the month again? → 월을 나타내는 별표는 어느 위치였죠?
If I want it to run every 15 minutes, is that */15 or just 15? → 15분마다 실행하고 싶다면 */15인가요, 아니면 그냥 15인가요?
Cron은 Unix/Linux 세계에서 가장 강력하고 필수적인 유틸리티 중 하나이지만, 그 문법은 개발자들이 정기적으로 마주하는 가장 직관적이지 않은 인터페이스라고 할 수 있습니다. 만약 6개월에 한 번씩만 cron 작업을 설정한다면, 매번 문법을 구글에 검색해야 할 가능성이 높습니다. 그리고 문법을 틀리면 백업이 실행되지 않거나, 더 심각하게는 매분 실행되어 서버가 다운될 수도 있습니다.
이제 그 다섯 개의 별표 때문에 머리를 싸매는 일을 그만 둘 시간입니다.
5성 두통
빠른 복습을 위해, 클래식 크론 구조는 종이에 보면 충분히 단순해 보입니다:
* * * * * /path/to/your/script.sh
다섯 개 필드는 다음을 나타냅니다:
- 분 (0‑59)
- 시 (0‑23, 24시간 형식)
- 월의 일 (1‑31)
- 월 (1‑12)
- 요일 (0‑7, 여기서 0과 7은 보통 일요일을 의미)
조합이 필요해질 때는 쉬워 보이지만, “평일 오전 9시마다”는 크게 어렵지 않지만 (0 9 * * 1-5), “매월 첫 번째 월요일”이나 복잡한 간격은 금세 혼란스러워질 수 있습니다.
두 가지 고전적인 Cron 함정
구문 문제를 해결하기 전에, 구문이 올바르더라도 cron 작업이 보통 실패하는 두 가지 이유를 기억하세요:
1. 경로 문제
Cron은 매우 최소한의 환경에서 실행됩니다. $PATH를 상속받지 않습니다.
Wrong
30 2 * * * python myscript.py
Right
30 2 * * * /usr/bin/python3 /home/user/scripts/myscript.py
인터프리터와 스크립트에 절대 경로를 항상 사용하세요.
2. 조용한 실패
cron 작업이 실패하면 보통 사용자에게 로컬 메일만 보내는데, 대부분의 사람들은 이를 확인하지 않습니다. stdout와 stderr를 모두 로그 파일로 리다이렉트하여 실제로 실행되었는지 확인하세요:
* * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
Source: …
더 똑똑한 방법: 구문 암기를 멈추세요
개발자는 다른 모든 것을 자동화합니다. 왜 우리는 아직도 머리로 직접 cron 간격을 계산하고 있을까요?
시각적 생성기를 사용해 문자열을 만들어 주는 것이 훨씬 안전하고, 빠르며, 스트레스도 적습니다. 원하는 인간이 읽을 수 있는 스케줄을 선택하면, 기계가 읽을 수 있는 코드를 바로 출력해 줍니다.
저는 최근에 이 Cron Job Builder 를 사용하기 시작했습니다.
주된 장점은 문자열을 생성하는 것뿐만 아니라 인간이 읽을 수 있는 검증입니다. 문자열이 “매일 자정에 실행”이라는 뜻이라고 생각할 수 있지만, 도구가 실제로 평문 영어로 확인해 주어 라이브 서버에 붙여넣기 전에 확신을 가질 수 있습니다.
실제 예시
예를 들어 트래픽이 가장 낮은 일요일 밤 2시 30분에 무거운 데이터베이스 집계 스크립트를 실행해야 한다고 가정해 봅시다.
수동 방식
그냥 생각합니다: “음, 분은 30. 시는 2 (오전 2시). 일자는 *. 월도 *. 요일은 일요일인데… 0? 아니면 7?” 결국 30 2 * * 0 을 만들고 운에 맡깁니다.
자동 방식
- Cron Job Builder 로 이동합니다.
- Minutes 탭에서 30을 체크합니다.
- Hours 탭에서 2를 체크합니다.
- Days of Week 탭에서 Sunday를 체크합니다.
도구가 즉시 생성합니다:
30 2 * * 0
더 중요한 것은 출력 아래에 다음과 같이 확인해 준다는 점입니다:
“At minute 30 past hour 2 on Sunday.”
“시각 2시 30분에 일요일에 실행됩니다.” (번역된 설명)
이제 언제 실행될지 100 % 확신을 가질 수 있습니다. crontab -e에 복사·붙여넣고, 더 흥미로운 문제로 넘어가세요.
결론
잘 사용하지 않는 구문을 외우느라 뇌 회전을 낭비하지 마세요. 프로덕션 작업을 잘못 구성할 위험은 수동으로 하는 “자부심”보다 더 큽니다. 생성기를 사용하고, 출력물을 검증한 뒤, 크론 작업이 실행해야 하는 실제 코드를 작성하는 데 에너지를 절약하세요.