[Linux] systemd service timer 예제
5초마다 실행되는 systemd 서비스를 timer를 이용해 만들어보자.
환경
- Ubuntu 18.04
목표
- systemd의 서비스를 특정 날짜에 혹은 반복적으로 crontab처럼 사용하고 싶을때 사용하는 timer의 예제를 직접 작성해본다.
- systemd의 timer는
OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec=
와 같은 옵션과OnCalendar=
를 사용하는데 아래 예제에서는OnCalendar=
를 사용합니다.
systemd service and timer
systemd
systemd
: Wikipedia에 따르면 init 시스템을 대신해 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 시스템이라고 한다.
service
service
: systemd에 있는 unit으로 systemd에 의해 관리되는 프로세스에 대해 기술한 파일이며 이를 통해 어떤 서비스나 프로그램이 실행된다.
timer
timer
: systemd에 있는 unit으로 특정 시간이나 이벤트에 따라 사용할 service를 위해 사용한다.
systemd service timer 파일 예제
만들어야할 파일
- 사용할 service 파일과 이벤트를 등록할 timer가 필요하다.
- timer로 돌리려는 service는 파일명이 둘이 같아야합니다!
- 예제에서 이름은 각각
on-calendar.service
그리고on-calendar.timer
입니다.
on-calendar.service
[Unit]
Description=Test for OnCalendar timer
[Service]
Type=oneshot
ExecStart=/usr/bin/test_on_calendar.sh
[Install]
WantedBy=multi-user.target
Description
: 이 서비스 파일에 대한 설명입니다.Type
: 실행할 서비스의 타입에 대한부분으로simple
,oneshot
그리고forking
과 같은 다양한 타입이 있지만 여기서는oneshot
으로 했습니다.oneshot
는 한번 사용하고 끝낼 서비스에 주로 사용되며 서비스의 프로세스가 끝날때까지 기다립니다. 해당 옵션을 사용하면 사용할때activating
으로 바뀌고 다 끝나면inactive
가 됩니다.ExecStart
: 해당 서비스가 실행할 파일의 절대경로를 넣어주시면 됩니다.WantedBy
: Unit이 어떻게 활성화(enable)될 것인지에 대한 부분이며systemctl enable
명령어를 사용하면 해당 부분의 target에 명시된 대로/etc/systemd/system
아래.wants
에 들어가게 됩니다. 부팅시 속한.wants
에 따라서 실행되게 됩니다.
/usr/bin/test_on_calendar.sh
- 사용할 실행 스크립트입니다.
#!/bin/bash
date >> /tmp/OnCalendarLog.txt
- 실행 권한을 줍니다.
chmod a+x /usr/bin/test_on_calendar.sh
on-calendar.timer
[Unit]
Description=Test for OnCalendar timer
[Timer]
OnCalendar=*-*-* *:*:0/5
AccuracySec=1s
[Install]
WantedBy=timers.target
Description
: 이 타이머에 대한 설명입니다.OnCalendar
: 언제 혹은 어느 주기에 서비스를 실행할지에 대한 옵션입니다. 형식은년-월-일 시:분:초
로 나타냅니다. 만약 n초마다 서비스를 실행하고 싶으면 위의 예제처럼*-*-* *:*:0/n
으로 해주면 되며 시나 분도 똑같습니다. 해당 옵션을 다양하게 사용가능합니다.AccuracySec
: 타이머를 돌릴때 확인하는 주기를 의미합니다. 기본값은 1분이며 1분마다 확인하여 이벤트가 발생할 시간이 맞다면 서비스를 실행합니다. 만약 초단위로 실행을 하고 싶으면 위의 예제처럼AccuracySec=1s
를 추가해야합니다.WantedBy
: Unit이 어떻게 활성화(enable)될 것인지에 대한 부분이며systemctl enable
명령어를 사용하면 해당 부분의 target에 명시된 대로/etc/systemd/system
아래.wants
에 들어가게 됩니다. 부팅시 속한.wants
에 따라서 실행되게 됩니다.
systemd service timer 사용 예제
부팅 후에도 사용할 수 있게 enable
$ systemctl enable on-calendar.timer
systemd timer 시작
$ systemctl restart on-calendar.timer
timer 등록 확인
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2020-02-09 00:02:35 KST 1s left Sun 2020-02-09 00:02:30 KST 2s ago on-calendar.timer on-calendar.service
예제 파일 결과
$ cat /tmp/OnCalendarLog.txt
Sun Feb 9 00:02:10 KST 2020
Sun Feb 9 00:02:15 KST 2020
Sun Feb 9 00:02:20 KST 2020
Sun Feb 9 00:02:25 KST 2020
Sun Feb 9 00:02:30 KST 2020
참고자료
- https://ko.wikipedia.org/wiki/Systemd
- https://www.freedesktop.org/software/systemd/man/systemd.timer.html
- https://www.freedesktop.org/software/systemd/man/systemd.service.html
- https://unix.stackexchange.com/questions/506347/why-do-most-systemd-examples-contain-wantedby-multi-user-target
- https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files