Cron 표현식 → systemd 타이머 변환 도구

cron 표현식(분 시 일 월 요일)을 systemd 타이머의 OnCalendar= 구문으로 변환하는 무료 도구입니다. 일과 요일을 동시에 지정했을 때의 OR 조건 차이를 경고로 알려주며, Docker/Kubernetes 환경으로 cron 작업을 이전할 때 유용합니다.

cron 필드와 systemd 구성 요소 대응표

cron 표현식의 5개 필드는 systemd의 OnCalendar= 구문에서 다음과 같이 대응합니다.

위치 cron 필드 systemd 대응 부분
1 시각 부분의 분(HH:MM:SS의 MM)
2 시각 부분의 시(HH:MM:SS의 HH)
3 일(날짜) 날짜 부분의 일(년-월-일의 일)
4 날짜 부분의 월(년-월-일의 월)
5 요일 요일 접두사(예: Mon, Mon..Fri)

cron에는 초 필드가 없으므로 systemd 쪽 초는 항상 "00"이 됩니다. 또한 날짜와 월이 모두 제한 없음(*)인 경우 systemd의 년-월-일 부분은 생략할 수 있습니다.

cron 요일 번호와 systemd 요일 약어 대응표

cron은 요일을 0~7의 숫자로 나타내지만, systemd는 영어 요일 약어를 사용합니다.

cron 요일 번호 systemd 요일 약어
0 (7) Sun
1 Mon
2 Tue
3 Wed
4 Thu
5 Fri
6 Sat

자주 쓰는 변환 예시

cron 표현식 OnCalendar= 의미
* * * * * OnCalendar=*-*-* *:*:00 매분 실행됩니다(cron의 "* * * * *"에 해당).
*/15 * * * * OnCalendar=*:00/15:00 15분마다 실행됩니다.
0 9 * * 1-5 OnCalendar=Mon..Fri 09:00:00 평일(월~금)오전 9시에 실행됩니다.
0 0 1 * * OnCalendar=*-*-01 00:00:00 매월 1일 0시에 실행됩니다.
0 0 1 1 * OnCalendar=*-01-01 00:00:00 매년 1월 1일 0시에 실행됩니다.
0 0 1 * 1 OnCalendar=Mon *-*-01 00:00:00 날짜(1일)와 요일(월요일)을 동시에 지정한 예시입니다. cron에서는 OR 조건(둘 중 하나만 일치해도 실행)이지만, systemd에서는 AND 조건(둘 다 일치해야 실행)이 되어 변환 결과가 원래 cron 표현식보다 실행 빈도가 줄어듭니다.

날짜와 요일을 모두 "*"가 아닌 값으로 제한한 cron 표현식은 systemd의 OnCalendar 구문만으로는 정확히 변환할 수 없습니다(cron은 OR 조건이지만 systemd는 항상 AND 조건이기 때문). 이런 경우 두 개의 별도 systemd 타이머로 분리하는 것을 고려하세요.

  • 날짜와 요일을 모두 "*"가 아닌 값으로 지정하면 cron의 OR 조건을 systemd의 AND 조건으로는 정확히 표현할 수 없습니다. 변환 결과의 경고를 확인하고, 필요하면 타이머를 두 개로 나누세요.
  • Alpine 기반 Docker 이미지처럼 일부 최소 구성 컨테이너에는 cron 데몬 자체가 포함되어 있지 않은 경우가 있어, systemd 타이머가 유효한 대안이 됩니다.
  • 생성된 OnCalendar 줄은 "systemd-analyze calendar" 명령으로도 구문을 검증할 수 있으며, 다음 실행 예정 시각까지 확인할 수 있습니다.
  • systemd 타이머는 crontab의 한 줄 설정과 달리 .timer 유닛과 실제 처리를 작성하는 .service 유닛, 두 개의 파일 세트로 구성됩니다.
  • 요일과 날짜를 동시에 사용하지 않는 단순한 일정(매시간・매일・매주 등)이라면 이 변환은 항상 정확하게 일치합니다.

자주 묻는 질문

OnCalendar=는 "요일 년-월-일 시:분:초" 형식으로 지정합니다(요일과 년-월-일 부분은 생략 가능). "*"는 "제한 없음(모두 일치)", ".."는 범위, "/"는 간격, ","는 나열을 나타냅니다. 예를 들어 "Mon..Fri 09:00:00"은 평일 오전 9시 정각을 의미합니다.

systemd 타이머는 journalctl을 통한 실행 로그 통합 관리, 의존하는 서비스의 시작 대기, 실패 시 자동 재시도 설정 등 cron 단독으로는 없는 기능을 제공합니다. 또한 Docker/Kubernetes 환경에서는 이미지를 가볍게 유지하기 위해 cron 데몬을 포함하지 않는 경우가 늘고 있어, systemd 기반 호스트에서는 타이머가 자연스러운 대안이 됩니다.

Vixie cron의 사양에서는 날짜와 요일이 모두 "*"가 아닌 값으로 제한되어 있으면 둘 중 하나만 일치해도 실행되는 OR 조건이 됩니다. 반면 systemd의 OnCalendar 구문에서는 요일 지정과 날짜 지정이 항상 AND 조건(둘 다 일치해야 함)입니다. 이 도구는 이런 경우를 감지하면 경고를 표시해, 변환 결과가 원래 cron 표현식보다 좁은 조건(실행 빈도가 적음)이 될 수 있음을 알려줍니다.

날짜와 요일을 동시에 사용하지 않는 단순한 일정이라면 정확하게 변환됩니다. 다만 위의 OR 조건 경고가 표시된 경우에는 의도한 빈도와 다를 수 있으므로, 운영 환경에 적용하기 전에 "systemd-analyze calendar" 명령으로 다음 실행 예정 시각을 확인하는 것을 권장합니다.

표준적인 5필드 cron 표현식에는 초 필드가 없으므로, 생성되는 OnCalendar 줄의 초 부분은 항상 "00"이 됩니다. systemd의 OnCalendar 구문 자체는 초 지정도 지원하지만, 이 도구는 cron에서 변환할 때 이 기능을 사용하지 않습니다.
ツールくん

여담 ― cron에서 systemd 타이머로

systemd는 2010년 무렵 Linux 부팅 과정을 관리하는 초기화 시스템으로 등장한 이래, 많은 배포판의 표준이 되었습니다. 그중 systemd 타이머 기능은 cron과 마찬가지로 주기적 실행 기능을 제공하지만, 의존 관계 해결, journalctl을 통한 실행 로그 통합 관리, 실패 시 재시도 설정 등 cron에는 없던 기능을 갖추고 있습니다.

한편 Docker나 Kubernetes 같은 컨테이너 환경에서는 이미지 크기를 가볍게 유지하기 위해 cron 데몬 자체를 포함하지 않는 베이스 이미지가 늘어나고 있습니다. 이런 환경에서 작업을 주기적으로 실행하려면 Kubernetes CronJob과 같은 오케스트레이터 차원의 방법을 쓰거나, 호스트 자체가 systemd 기반이라면 systemd 타이머에 맡기는 것이 현실적인 선택지가 됩니다.

OnCalendar= 구문은 cron의 5개 필드보다 표현력이 뛰어나 연 단위 지정이나 초 단위 정밀도도 지원하지만, 그 표현력의 차이 때문에 일부 cron 표현식(날짜와 요일을 동시에 제한한 OR 조건)은 단순 변환으로는 의미가 달라져 버립니다. 이 도구가 이 점을 명시적으로 경고하는 것은 이전 작업 중 놓치기 쉬운 함정을 미리 발견할 수 있도록 하기 위함입니다.