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

 

이 글은 개인 블로그인 umount blog 에서도 보실 수 있습니다.

5 1 vote
Article Rating
Subscribe
Notify of
guest

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

0 Comments
Inline Feedbacks
View all comments
Scroll to top
0
Would love your thoughts, please comment.x
()
x