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