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
호호호호 이참에 timer도 공부해보겠습니다
호호호 고생하셨습니다.
와..제 블로그에 댓글 달린건 처음입니다 첫 댓글 감사드립니다 ㅎㅎ
systemd는 진짜 양파 같은놈이라 까면 깔수록 계속 공부할게 나와서 매우 힘드네요..같이 열공합시다!!