Migrating cron jobs to systemd.timer

cron 을 대체하는 systemd.timer 사용 가이드

Cron(이하 크론)은 특정 명령어나 스크립트의 반복적인 실행을 위한 가장 보편적인 서비스 입니다. systemd.timer 는 CentOS 7 부터 도입된 systemd 에서 동작하는 크론과 동일한 역활을 해주는 기능입니다.

systemd.timer(이하 타이머) 는 크론과 흡사하지만 더욱 직관적이고 매우 간단 합니다. 지금까지 크론에 익숙해져 있던 분들도 타이머에 익숙해 지는 것이 전혀 어렵지 않으며, CentOS 시스템이 systemd 로 변경된 만큼 타이머에도 익숙해 지길 권장 드립니다.

타이머 예제

1. 반복 작업을 실행할 스크립트 파일을 하나 만듭니다.
: vi /root/timer.sh

#!/bin/bash

date >> /root/timer.log

2. 스크립트를 실행하는 서비스 파일을 만듭니다.
: vi /etc/systemd/system/myjob.service

[Unit]
Description=Run to myjob

[Service]
ExecStart=/root/timer.sh

3. 서비스를 실행할 타이머 파일을 만듭니다.
: vi /etc/systemd/system/myjob.timer

[Unit]
Description=myjob timer

[Timer]
OnBootSec=1min
OnCalendar=*:*:1
Unit=myjob.service

[Install]
WantedBy=multi-user.target

4. 부팅 시 실행되도록 타이머를 enable 합니다.

systemctl enable myjob.timer

5. 타이머를 실행합니다.

systemctl start myjob.timer

6. 타이머가 정상적으로 작동하는지 확인해 봅니다. 예제에서는 1분간격으로 실행하도록 설정하였습니다.

tail -f /root/timer.log

Mon Apr 27 14:46:44 KST 2020
Mon Apr 27 14:47:44 KST 2020
Mon Apr 27 14:48:44 KST 2020
Mon Apr 27 14:49:44 KST 2020
Mon Apr 27 14:50:44 KST 2020

타이머 설정 가이드

myjob.timer 파일을 보면 [Timer] 섹션이 있습니다. 이 부분이 가장 중요한 부분입니다.

OnBootSec : 타이머는 시작점을 기준으로 타이머를 정의 할 수 있으며, 옵션으로는 OnActiveSec, OnBootSec, OnStartupSec, OnUntilActiveSec, OnUnitInactiveSec 이 있습니다. OnBootSec 옵션은 부팅 후 1분 뒤에 타이머가 동작한다는 의미입니다. 이와 같은 타이머 동작 형식을 Monotonic 이라고 합니다.

OnCalendar : 크론에서 반복 작업 시간을 설정할 때 사용했던 형식과 유사합니다. 이와 같은 타이머 동작 형식을 Realtime 이라고 합니다. 아래는 OnCaledar 의 전체 형식입니다.

["요일"] "년"-"월"-"일" "시":"분":"초" [timezone]

하지만 예제에 있는 OnCalendar 설정을 보면 *:*:1 과 같이 되어 있습니다. 이와 같이 전체 형식으로 작성하지 않고 불 필요한 부분은 생략해도 타이머가 동작하는데 크게 상관 없습니다.

OnCalendar 는 범위를 설정할 수도 있는데, 범위는 .. 으로 설정하면 됩니다. 예를 들어 월요일부터 금요일까지로 설정하시려면 Mon..Fri 로 하시면 됩니다. 범위 설정은 요일, 년, 월, 일, 시, 분, 초 모두 가능합니다.

재미있는 점으로는 단순하고 자주 쓰이는 형식의 경우 minutely, hourly, daily, monthly, weekly, yearly, quarterly, semiannually 와 같은 형식으로 사전 정의되어 있기 때문에 이 형식만 입력해 주셔도 됩니다.

이 외에도 [timezone] 섹션을 추가하여 타임존을 설정하실 수도 있습니다. 타임존 설정을 하지 않으시면 시스템 타임존을 기본값으로 참조 합니다.

타이머 관련하여 더 자세한 내용은 systemd.timer (www.freedesktop.org) 페이지를 참고 해 주시면 됩니다.

Tip

서비스 파일과 타이머 파일명이 동일한 경우 타이머 파일의 [Timer] 섹션에 Unit 을 지정하지 않아도 동작합니다. 즉, 파일명이 myjob.service, myjob.timer 일 경우 myjob.timer 파일에 Unit=myjob.service 을 설정하지 않아도 정상 동작합니다.

만일 파일명이 myjob1.service, myjob.timer 일 경우에는 반드시 [Timer] 섹션에 Unit=myjob1.service 으로 설정을 해주셔야 합니다.

예약된 작업을 확인하기 위한 명령어는 아래와 같습니다.

systemctl is-enabled myjob.timer
systemctl is-active myjob.timer
systemctl list-timers myjob.timer
systemctl list-timers

You may also like...

Subscribe
Notify of
guest

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

2 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
freshtuna
freshtuna
2020-04-27 16:41

호호호호 이참에 timer도 공부해보겠습니다
호호호 고생하셨습니다.

2
0
Would love your thoughts, please comment.x
()
x