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 조건이기 때문). 이런 경우 변환 결과의 의미를 반드시 확인하세요.

systemd 타이머를 cron 식으로 되돌리기

이 도구는 systemd 타이머의 `OnCalendar=`를 「분 시 일 월 요일」이라는 cron 식으로 되돌립니다. `daily`나 `weekly` 같은 이름 붙은 줄임말도 다룹니다. 짝이 되는 도구의 반대 방향에 해당합니다.

**이 방향의 변환에서 조심할 것은, systemd로 적을 수 있는 일부를 cron이 나타내지 못한다는 점입니다.** `OnCalendar=`는 **초 단위의 지정**도, `*-*-01..07` 같은 **날짜의 구간**도 적을 수 있지만, cron의 다섯 칸에는 어느 쪽도 담기지 않습니다. 멈춰 있던 동안 놓친 실행을 켜진 뒤에 되돌려 주는 `Persistent=`도 cron에는 바로 맞먹는 것이 없습니다. **또 하나는 일과 요일의 의미로, systemd는 둘을 그리고로 다루는 데 비해 cron은 또는으로 읽습니다.** 그대로 옮기면 일정이 더 자주 도는 쪽으로 기울므로, 이 도구는 해당하는 경우에 경고를 냅니다.

변환하는 순서

  1. OnCalendar=의 값을 넣습니다 `Mon *-*-* 06:00:00` 같은 꼴도, `daily` 같은 이름도 됩니다.
  2. 만들어진 cron 식을 확인합니다 다섯 칸에 대응된 결과를 얻습니다.
  3. 경고를 읽습니다 **cron으로는 나타낼 수 없는 지정과 의미의 차이가 모두 짚입니다.**
  4. crontab에 옮겨 적습니다 뒤에 돌릴 명령을 이어 적으면 그 줄을 그대로 등록할 수 있습니다.

더 잘 활용하기 위한 팁

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

이럴 때 쓸 수 있습니다

systemd가 없는 환경으로 옮길 때

**컨테이너나 오래된 유닉스 계열에서는 cron밖에 쓸 수 없는 경우가 있습니다.**

기존 타이머를 읽어 낼 때

`OnCalendar=`의 표기가 낯설어도 cron 식으로 바꾸면 빈도를 짚을 수 있습니다.

두 환경에서 같은 일정을 지킬 때

**운영은 systemd, 개발은 cron인 구성에서 두 설정을 맞대어 볼 수 있습니다.**

일정을 톺아볼 때

한꺼번에 변환해 보면 간격이 뜻대로인지 되짚어 볼 기회가 됩니다.

스케줄러 용어

OnCalendar=
systemd 타이머에서 시각을 밝히는 키입니다. **요일과 날짜, 시각을 한 줄에 적을 수 있습니다.**
cron 식
분·시·일·월·요일의 다섯 칸으로 시각을 나타내는 표기입니다. **초 단위로는 지정할 수 없습니다.**
이름 붙은 줄임말
`daily`·`weekly`·`monthly`처럼 흔한 주기에 붙인 다른 이름입니다.
의미의 차이
**일과 요일을 함께 지정했을 때 systemd는 그리고로, cron은 또는으로 읽습니다.**
Persistent=
멈춰 있던 동안 놓친 실행을 켜진 뒤 되돌리는 설정입니다. **cron에는 곧바로 맞먹는 것이 없습니다.**
crontab
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일인 날, 또는 월요일인 날" 양쪽 모두에서 실행되어 버립니다. 본 도구가 이 점을 명시적으로 경고하는 것은, 이전 시 놓치기 쉬운 이러한 의미 변화를 알아차리도록 하기 위함입니다.