Migrating cron jobs to systemd.timer

cron 대신 systemd.timer 를 사용하는 방법에 대한 예제

 

그동안 반복 스케쥴 작업은 Cron (혹은 Crond, Crontab)에 의해 실행되는게 당연시되었습니다.

systemd 에서는 cron 작업과 동일하게 반복적인 스케쥴을 timer 를 통해 실행할 수 있습니다.

systemd.timer는 cron만큼 단순하지만 cron 보다 직관적입니다.

반복 스케쥴 작업을 Cron 에서 systemd.timer로 변경하면 확실히 장점이 많아 집니다.

systemd 에 반대하시는 분들이 아직도 많이 있습니다만, 변화는 필요한 과정이라고 생각합니다.

그동안 cron 을 익숙하게 사용했던 사용자라면 systemd.timer 에 익숙해 지는것도 어렵지 않습니다.

 

우선 간단한 사용법 부터 보도록 하겠습니다.

1. 스케쥴 job으로 실행할 스크립트 파일을 하나 만듭니다.
: vi /root/timer.sh

#!/bin/bash

date >> /root/timer.log

 

2. 실제 실행할 job service를 만듭니다.
: vi /etc/systemd/system/myjob.service

[Unit]
Description=Run to myjob

[Service]
ExecStart=/root/timer.sh

 

3. myjob 서비스를 실행할 timer를 만듭니다.
: 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

// 아래와 같은식으로 1분마다 로그가 찍히면 됩니다.
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

 

위 예제에서 눈여겨 볼 내용이 [Timer] 섹션에 있습니다.

1. 우선 OnBootSec 입니다. Cron 에서는 볼수 없었던 기능입니다.

systemd 의 timer 에는 시작점을 기준으로 타이머 정의가 가능합니다.

옵션으로는 OnActiveSec, OnBootSec, OnStartupSec, OnUntilActiveSec, OnUnitInactiveSec 이 있습니다.

위에서 설정된 OnBootSec 옵션은 부팅 후 1분뒤에 타이머가 동작한다는 의미입니다.

이와 같은 타이머 동작 형식을 Monotonic 이라고 합니다.

 

2. 다음은 OnCalendar 입니다.

Cron 을 사용해보신 분이라면 감이 오실겁니다. 바로 Cron 에서 반복작업 스케쥴을 할때 사용했던 형식과 유사합니다.

이와 같은 타이머 동작 형식을 Realtime 이라고 합니다.

전체 형식으로 풀이하면 아래와 같습니다.

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

이때, 필요없는 부분은 빼고 작성해도 타이머가 동작하는데 무방합니다.

위 예제에서는 매 1분마다 실행하도록 설정된 타이머 예시입니다.

OnCalendar 에서는 범위를 설정할 수도 있는데, 범위는 .. 으로 설정하면 됩니다. 즉, 월요일부터 금요일까지로 설정하시려면 Mon..Fri 로 하시면 됩니다.

범위 설정은 요일, 년, 월, 일, 시, 분, 초 모두 가능합니다.

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

[timezone] 은 설정하지 않아도 무방하며, 기본값은 시스템 타임존으로 설정됩니다.

 

systemd.timer 관련 문법은 아래 링크에서 자세하게 확인 가능합니다.
https://www.freedesktop.org/software/systemd/man/systemd.timer.html

또는 매뉴얼 페이지에서도 자세한 예제와 설명을 참조하실 수 있습니다.

man systemd.timer

 

Tip.

job service 파일과 job timer 파일명이 동일한 경우 job timer 파일의 [Timer] 섹션에 Unit 을 지정하지 않아도 동작합니다.

즉, 파일명이 myjob.service, myjob.timer 일 경우에는 myjob.timer 파일에 Unit을 설정하지 않아도 정상 동작합니다.

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

 

Tip.

예약된 작업을 확인하기 위한 커맨드는 아래와 같습니다.

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