Cron 표현식 파서

Cron 표현식은 Unix 계열 시스템에서 반복 작업의 스케줄을 정의합니다. 이 도구는 cron 구문(5-7 필드)을 파싱하고, 각 필드를 일반 언어로 설명하며, 다음 예정된 실행 시간을 계산하고, 일반적인 실수에 대해 경고합니다. 사용자 crontab 형식과 사용자 및 명령 필드가 있는 시스템 crontab 형식 모두 지원합니다.

사양

주요 사용 사례

  • cron 작업이 예상 시간에 실행되지 않는 이유 디버깅
  • 구성에서 상속된 cron 표현식 이해
  • 백업 및 유지보수 스케줄 계획
  • CI/CD 파이프라인 스케줄 확인 (GitHub Actions, GitLab CI)
  • 배포 전 Kubernetes CronJob 스케줄 테스트
  • /etc/crontab 또는 /etc/cron.d/의 시스템 crontab 항목 분석

기능

  • 5필드(표준), 6필드(초 포함), 7필드(초 및 연도 포함) cron 표현식 파싱
  • 사용자 필드가 있는 시스템 crontab 형식 지원 (예: "0 5 * * * root /path/to/script")
  • cron 라인에서 명령 추출 및 표시
  • 각 필드를 사람이 읽을 수 있는 언어로 설명
  • 다음 10회 예정된 실행 시간 계산
  • 범위(1-5), 목록(1,3,5), 스텝(*/15), 이름(MON, JAN) 지원
  • 스케줄에서 31일을 지정하는 것과 같은 일반적인 문제 경고

예제

평일 오전 9시마다

사용해 보기 →

월요일부터 금요일까지 오전 9:00에 실행.

0 9 * * 1-5

매시간 0, 15, 30, 45분에 실행.

*/15 * * * *

사용자와 명령이 있는 시스템 Crontab

사용해 보기 →

root 사용자로 오전 5시에 일일 백업 (/etc/crontab의 시스템 crontab 형식).

0 5 * * * root /usr/bin/backup.sh

명령이 있는 Cron (사용자 Crontab)

사용해 보기 →

5분마다 상태 확인 (사용자 crontab 형식).

*/5 * * * * curl -s http://localhost/health

매월 1일 자정에 실행.

0 0 1 * *

  • 다섯 필드는: 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-6, 일요일=0)입니다.
  • 시스템 crontab(/etc/crontab, /etc/cron.d/*)은 명령 앞에 사용자 이름을 위한 6번째 필드가 있습니다.
  • 사용자 crontab(crontab -e)에는 사용자 이름 필드가 없으며, crontab 소유자로 실행됩니다.
  • *는 "매번"을, */n은 "n번째마다"를 의미합니다.
  • 요일 이름(SUN-SAT)과 월 이름(JAN-DEC)은 대소문자를 구분하지 않습니다.
  • 일(day-of-month)과 요일(day-of-week)을 함께 사용할 때 주의하세요. 구현에 따라 동작이 다릅니다.

이해하기 Cron 표현식 파서

Cron은 Unix 계열 운영 체제의 시간 기반 작업 스케줄러이며, cron 표현식은 작업이 실행되는 시점을 정의하는 압축된 구문입니다. 표준 5필드 형식은 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-6, 0은 일요일)을 지정합니다. 별표(*)는 모든 값에 일치하며, "* * * * *"는 매분 실행됩니다.

단순 값 외에도 cron은 여러 연산자를 지원합니다. 범위(1-5)는 연속적인 범위에 일치합니다. 목록(1,3,5)은 개별 값에 일치합니다. 스텝 값(*/15)은 정기적인 간격을 생성합니다. 이를 조합할 수 있습니다: 요일의 1-5/2는 월요일, 수요일, 금요일을 의미합니다. 월과 요일 필드는 세 글자 이름(JAN-DEC, SUN-SAT)을 허용합니다.

Cron 구현은 다양합니다. 사용자 crontab은 5개 필드와 명령으로 구성됩니다. 시스템 crontab은 사용자 이름 필드를 추가합니다. 일부 구현은 초를 위한 6번째 필드(Spring, Quartz, Kubernetes)와 연도를 위한 7번째 필드를 지원합니다. AWS EventBridge, GitHub Actions 및 기타 클라우드 스케줄러는 각각 고유한 변형이 있습니다.

일반적인 함정으로는 일(day-of-month)과 요일(day-of-week) 필드 간의 상호작용이 있습니다: 둘 다 지정된 경우(*가 아닌), 어느 조건이든 참일 때 작업이 실행됩니다(OR 논리). 시간대 처리도 문제입니다. CRON_TZ가 설정되지 않으면 cron 작업은 시스템 시간대에서 실행되며, 일광 절약 시간 전환은 작업을 건너뛰거나 두 번 실행하게 할 수 있습니다.

/ 연산자는 스텝 값을 생성합니다. 분 필드의 */5는 "5분마다"를 의미하며 매시간 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55분에 실행됩니다. 범위를 스텝과 조합할 수 있습니다: 10-30/5는 10분에서 30분 사이 5분마다를 의미합니다. 특정 요일의 특정 시간에 작업을 실행하려면, 분과 시 필드를 원하는 시간으로 설정하고 요일 필드를 대상 요일로 설정하세요. 예를 들어, "30 14 * * 1-5"는 월요일부터 금요일 오후 2:30에 실행되고, "0 9 * * 0"은 매주 일요일 오전 9시에 실행됩니다. 모든 시간은 CRON_TZ가 명시적으로 구성되지 않으면 서버의 현지 시간대로 해석됩니다.

Cron은 벽시계 시간을 사용하므로, 일광 절약 시간 전환이 예기치 않은 동작을 유발할 수 있습니다. 시계가 앞으로 이동하면 오전 2:00에서 2:59 사이에 예정된 작업이 완전히 건너뛸 수 있습니다. 시계가 뒤로 이동하면 해당 구간의 작업이 두 번 실행될 수 있습니다. 중요한 작업의 경우 CRON_TZ=UTC를 설정하면 이러한 문제를 피할 수 있습니다. 또는 전환 시간대에 작업을 예약하지 않거나, 중복 실행이 무해하도록 작업을 멱등성으로 설계하세요.

Cron 구문은 Unix 시스템을 넘어 광범위하게 채택되었습니다. Kubernetes CronJobs, GitHub Actions, GitLab CI, AWS EventBridge, Google Cloud Scheduler, Spring @Scheduled 및 많은 작업 큐 라이브러리가 모두 스케줄링에 cron 표현식을 사용합니다. 그러나 각 구현은 다른 기능을 지원할 수 있습니다. 일부는 초 필드를 추가하고, 일부는 연도 필드를 추가하며, 일부는 일(day-of-month) 또는 요일(day-of-week) 필드에서 "특정 값 없음"을 의미하는 ?를 사용합니다.

← 전체 도구로 돌아가기