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

systemd 타이머의 OnCalendar= 구문을 cron 표현식(분 시 일 월 요일)으로 변환하는 무료 도구입니다. 자매 도구 "Cron→systemd 타이머 변환"의 역방향입니다. daily·weekly 등 이름이 붙은 단축 표기도 지원하며, 날짜와 요일을 동시에 지정한 경우의 의미론적 차이도 경고로 표시합니다.

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

systemd의 OnCalendar= 구문 각 부분은 cron 표현식의 5개 필드와 다음과 같이 대응합니다.

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

systemd의 초 지정(HH:MM:SS의 SS)은 대응하는 cron 필드가 없어 변환 시 무시됩니다("00" 이외의 초가 지정된 경우 경고가 표시됩니다).

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

systemd는 영어 요일 약어를 사용하지만, cron은 0~6의 숫자로 표현합니다.

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

systemd 이름 붙은 단축 표기와 cron 표현식 대응표

systemd에는 "daily"、"weekly"처럼 읽기 쉬운 이름이 붙은 특수 표기가 있으며, 본 도구는 이들도 cron 표현식으로 변환할 수 있습니다.

OnCalendar= cron 표현식
minutely * * * * *
hourly 0 * * * *
daily / midnight 0 0 * * *
weekly 0 0 * * 1
monthly 0 0 1 * *
yearly / annually 0 0 1 1 *

자주 사용하는 변환 예시

OnCalendar= cron 표현식 의미
*-*-* *:*:00 * * * * * 매분 실행합니다(cron의 "* * * * *"에 해당).
*:00/15:00 */15 * * * * 15분마다 실행합니다.
Mon..Fri 09:00:00 0 9 * * 1-5 평일(월~금)9시 0분에 실행합니다.
*-*-01 00:00:00 0 0 1 * * 매월 1일 0시 0분에 실행합니다.
*-01-01 00:00:00 0 0 1 1 * 매년 1월 1일 0시 0분에 실행합니다.
Mon *-*-01 00:00:00 0 0 1 * 1 날짜(1일)와 요일(월요일)을 모두 지정한 예시입니다. systemd에서는 AND 조건(둘 다 만족해야 함)이지만, cron에서는 OR 조건(둘 중 하나만 만족하면 됨)으로 해석되므로, 변환 결과는 원래 OnCalendar 표현식보다 실행 빈도가 많아지는 점에 주의하세요.

날짜와 요일을 모두 "*" 이외로 제한한 OnCalendar 표현식은 cron 표현식으로 정확히 변환할 수 없습니다(systemd는 AND 조건, cron은 OR 조건이기 때문). 이런 경우 변환 결과의 의미를 반드시 확인하세요.

사용 팁

  • "daily"、"weekly"、"monthly"와 같은 이름 붙은 단축 표기도 그대로 입력할 수 있습니다. 내부적으로 대응하는 cron 표현식(예: daily는 "0 0 * * *")으로 변환됩니다.
  • 날짜와 요일을 모두 "*" 이외로 지정하면, systemd의 AND 조건을 cron의 OR 조건으로 변환할 때 의미가 달라집니다. 이 경우 경고를 확인하고 변환 결과가 의도한 대로인지 반드시 확인하세요.
  • OnCalendar 구문의 연도 지정・초 지정은 cron에 존재하지 않는 필드이므로 변환 시 무시됩니다(경고로 알림).
  • Kubernetes CronJob으로의 이전 등, systemd 타이머를 cron 형식의 일정 표기로 되돌리고 싶을 때 활용할 수 있습니다.
  • 요일과 날짜를 동시에 사용하지 않는 단순한 일정(매시・매일・매주 등)이라면 이 변환은 항상 정확하게 일치합니다.

자주 묻는 질문

systemd를 사용할 수 없는 경량 Docker 컨테이너로 이전하는 경우, cron 형식의 일정 표기를 사용하는 Kubernetes CronJob에서 같은 정기 실행을 재현하고 싶은 경우, 또는 팀의 운영 도구가 cron 형식 설정만 지원하는 경우 등에 기존 systemd 타이머 설정을 cron 표현식으로 되돌릴 필요가 생깁니다.

네. "minutely"、"hourly"、"daily"、"weekly"、"monthly"、"yearly"와 같은 systemd의 이름 붙은 단축 표기를 그대로 입력하면 대응하는 cron 표현식으로 변환됩니다.

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

cron 표현식에는 연도를 지정하는 필드가 없기 때문에, OnCalendar 표현식에 연도 지정("*" 이외의 값)이 있어도 cron으로 변환할 때 무시됩니다. 본 도구는 이 경우 경고를 표시하여, 변환 결과가 지정한 연도와 관계없이 매년 실행됨을 알립니다.

cron_to_systemd 도구가 생성하는 주요 패턴(매분・매시・매일・매주・매월・매년・간격 지정・범위 지정・목록 지정・요일 지정・이름 붙은 단축 표기)은 지원하지만, OnCalendar 구문은 cron보다 표현력이 높아 매우 복잡한 지정(여러 연도, 초 단위의 세밀한 반복 등)은 cron으로 정확히 표현할 수 없어 변환에 실패할 수 있습니다.
ツールくん

여담 ― systemd 타이머에서 cron으로 "되돌아간다"는 것

일반적으로 기술 이전은 한 방향(오래된 방식에서 새로운 방식으로)으로 이야기되기 쉽지만, 실제 현장에서는 그 반대 방향의 변환이 필요한 경우도 적지 않습니다. systemd를 채택한 호스트 환경에서, cron만 지원하는 경량 컨테이너나 cron 형식의 일정 표기를 채택한 오케스트레이션 도구(Kubernetes CronJob 등)로 워크로드를 이전할 때, OnCalendar 구문을 cron 표현식으로 되돌리는 작업이 발생합니다.

이 "역변환"이 단순한 일대일 대응이 되지 않는 이유는 systemd의 OnCalendar 구문이 cron보다 표현력이 높은 사양이기 때문입니다. 연 단위 지정・초 단위 정밀도・날짜와 요일의 AND 조건적 조합 등, cron의 5개 필드로는 표현할 수 없는 개념을 가지고 있습니다. 그래서 본 도구는 "자주 사용되는 주요 패턴을 정확히 변환하는 것"을 목표로 하고, 대응할 수 없는 복잡한 지정은 변환 오류로 처리하는 설계를 채택했습니다.

날짜와 요일을 모두 지정한 경우의 의미론적 차이(systemd는 AND 조건, cron은 OR 조건)는 이 역변환에서 가장 큰 함정입니다. "매월 1일"이면서 "월요일"이라는 조건을, systemd는 "1일이면서 동시에 월요일인 날"로만 좁히지만, cron에서는 "1일인 날, 또는 월요일인 날" 양쪽 모두에서 실행되어 버립니다. 본 도구가 이 점을 명시적으로 경고하는 것은, 이전 시 놓치기 쉬운 이러한 의미 변화를 알아차리도록 하기 위함입니다.