Cron, Crontab, Cronjob
유닉스 계열 운영체제에서 특정 작업을 정해진 시간에 자동으로 실행하려면 Cron을 사용합니다. Cron은 백그라운드에서 동작하는 데몬(daemon)이며, 스케줄링 설정을 바탕으로 명령어나 스크립트를 실행합니다
- Cron: 시간 기반 잡 스케줄러(Job Scheduler)로, 특정 시간에 작업을 실행하는 시스템 데몬
- Crontab: ‘Cron Table’의 약자로, Cron 작업의 목록과 실행 시간을 정의하는 설정 파일 또는 해당 파일을 다루는 명령어
- Cronjob: Crontab에 등록되어 주기적으로 실행되는 개별 작업
이 글에서는 Cronjob을 정의하는 Cron 표현식(Cron Expression)의 구조와 문법을 정리합니다
Cron 표현식 구조
Cron 표현식은 공백으로 구분된 여러 필드의 조합으로 구성됩니다. 표준 Cron은 5개 필드(분, 시, 일, 월, 요일)를 사용하지만, 초(Seconds) 필드를 포함한 6개 필드나 연도(Year) 필드까지 포함한 7개 필드를 지원하는 구현도 많습니다
| 필드 | 값 범위 | 허용 특수문자 |
|---|---|---|
| 초(Seconds) | 0-59 | * , - / |
| 분(Minutes) | 0-59 | * , - / |
| 시(Hours) | 0-23 | * , - / |
| 일(Day of Month) | 1-31 | * , - ? L W / |
| 월(Month) | 1-12 또는 JAN-DEC | * , - / |
| 요일(Day of Week) | 0-7 또는 SUN-SAT (0과 7은 일요일) | * , - ? L # / |
| 연도(Year) | 1970-2099 (생략 가능) | * , - / |
참고: 일과 요일 필드에는 동시에 값을 지정할 수 없는 경우가 많습니다. 이 경우, 둘 중 하나에만 값을 지정하고 다른 하나는 ?로 설정하여 ‘값 없음’을 명시합니다
특수문자 의미
Cron 표현식은 특수문자를 사용하여 복잡한 스케줄을 간결하게 정의할 수 있습니다
*: 모든 값을 의미 (예: 분 필드에*은 ‘매 분’을 의미)?: 값을 지정하지 않음을 의미.일과요일필드 중 하나를 지정하지 않을 때 사용-: 값의 범위를 지정 (예:9-17은 9부터 17까지),: 여러 값을 나열 (예:MON,WED,FRI는 월, 수, 금요일)/: 증분 값을 설정.A/B는 ‘A’로 시작하여 ‘B’만큼 값을 증가시킴 (예: 분 필드의0/15는 0, 15, 30, 45분)L: ‘마지막(Last)‘을 의미.일필드에서는 ‘이달의 마지막 날’,요일필드에서는 단독 사용 시 ‘이 주의 마지막 요일(토요일)‘을 의미.5L과 같이 숫자와 함께 쓰면 ‘이달의 마지막 금요일’을 지정W: ‘평일(Weekday)‘을 의미. 지정한 날짜로부터 가장 가까운 평일(월-금)을 찾음 (예:15W는 15일이 토요일이면 14일에, 일요일이면 16일에 실행)#: ’n번째 요일’을 지정.요일#주형식으로 사용 (예:2#3은 ‘세 번째 화요일’을 의미)
주요 표현식 예시
자주 사용되는 Cron 표현식 예시입니다
0 0 * * *: 매일 자정(0시 0분)에 실행0 */2 * * *: 2시간마다 매 정각에 실행 (0시, 2시, 4시…)0 9-18 * * 1-5: 평일(월-금) 오전 9시부터 오후 6시까지 매시 정각에 실행0 0 1,15 * *: 매월 1일과 15일 자정에 실행0 0 L * *: 매월 마지막 날 자정에 실행* * * * *: 매 1분마다 실행 (테스트 용도 외에는 시스템 부하를 유발할 수 있어 사용에 주의)
마무리
Cron 표현식은 처음에는 복잡해 보이지만, 구조와 특수문자의 의미를 이해하면 강력한 스케줄링 도구가 됩니다. 표현식 작성이 어렵다면 Cron 표현식을 시각적으로 만들고 검증해주는 온라인 도구를 활용하는 것도 좋은 방법입니다. Cron Maker와 같은 사이트가 유용할 수 있습니다