[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


참고자료