Systemd 유닛, 부팅 후 5분 후에 실행시키기
간혹 이런게 필요할때가 있다. 부팅을 하고 난 후에, 그것도 한 10분 후 혹은 5분 후에 프로그램을 한번만 실행시키고 싶을때…. 보통 이런 것들은 시스템 모니터링을 위해 시스템의 정보를 원격 서버에 등록하는 것과 같은 것이 있다.
과거에는 /etc/rc.local 에 스크립트를 등록해서 해결했다. 하지만 rc.local 도 SystemV Init 의 유산이라, Systemd 로 변경되면서 사라졌다.
그러면 부팅 후 실행 혹은 부팅하고 5분, 수분, 그러니까 몇분이 지난 후에 한번 실행시키는 방법은 없을까?
Systemd Timer
Systemd 는 Timer 라는 게 있다. Systemd 유닛에 여러 타입이 있는데, 일반적으로 service 를 타입을 많이 쓴다. service 타입은 그야말로 데몬으로 등록하도록하는 것이다. Spring Boot 를 시작/중지 시키기등을 할때에 service 유닛을 만든다.
Timer 는 이름에서와 같이 시간에 의존해서 작동된다. 놀랍게도 timer 유닛은 오랫동안 그리고 현재도 리눅스에 사용되고 있는 cron 을 대체할 수도 있다.
특정 시점에서 실행시키기도 하고 몇분마다 반복적으로 실행되게 할 수도 있다. 아예 날짜를 지정해 특정 날짜가 되면 실행이되도록 할 수도 있다. 서론에서 말했던 부팅하고 난 후에 몇분 후에 실행되도록 할 수도 있다.
timer 유닛은 이름 그대로 시간만 잰다. timer 유닛은 유닛 이름과 동일한 service 유닛을 설정된 시간에 실행시켜주는 역할만 한다. 그래서 timer 유닛은 동일한 service 유닛과 함께 사용된다.
그러면 ‘부팅을 한 후 5분 후에 service 유닛을 실행시키기’ 를 한번 해보자.
‘한번만 실행된다’ 주목해서 service 유닛에서 실행 타입을 ‘oneshot’ 으로 해줘야 한다. 다음 예제와 같다.
1 2 3 4 5 6 |
[Unit] Description=check timer service [Service] Type=oneshot ExecStart=/usr/local/bin/a.sh |
이름은 간단하게 ‘a.service’ 로 했다. service 유닛의 위치는 /etc/systemd/system 디렉토리다. 이제 service 유닛을 부팅 후에 5분이 된 시점에 실행되도록 timer 유닛을 다음과 같이 작성한다. 파일 이름은 a.timer 다.
1 2 3 4 5 6 7 8 |
[Unit] Description=timer for a.sh [Timer] OnBootSec=5min [Install] WantedBy=timers.target |
단순하다. 중요한건 유닛의 이름이 같아야 한다.
주의사항
한가지 주의사항이 있다. service 유닛을 timer 유닛이 실행시켜주는 구조로 되어 있다보니 service 유닛은 ‘enabled’ 상태여서는 안된다. enabled 상태란, 부팅과 동시에 자동 실행 설정이다. 그런데, timer 유닛은 특정 시점에서 service 유닛을 실행시켜야 하기 때문에 service 유닛이 부팅과 동시에 자동으로 실행되면 안된다.
따라서, service 유닛은 ‘disabled’ 상태여야 하고 timer 유닛은 ‘enabled’ 상태여야 한다.
1 2 |
systemctl enable a.timer systemctl disable a.serivce |
Timer 유닛 리스트, 상태
timer 유닛에 어떤게 있는지를 다음과 같이 확인할 수 있다.
1 |
systemctl list-units --type=timer |
timer 유닛에 스케줄 상태를 다음과 같이 확인할 수있다.
1 2 3 4 5 |
systemctl list-timers --all NEXT LEFT LAST PASSED UNIT ACTIVATES n/a n/a Tue 2024-09-24 17:14:11 UTC 34min ago a.timer a.service Wed 2024-09-25 17:28:38 UTC 23h left Tue 2024-09-24 17:28:38 UTC 19min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service n/a n/a n/a n/a systemd-readahead-done.timer systemd-readahead-done.service |
몇가지 예제
다음과 같은 예제가 있다.
1 2 3 4 5 6 7 8 9 |
[Unit] Description=timer for a.sh [Timer] OnBootSec=5min OnUnitActiveSec=1h [Install] WantedBy=timers.target |
위 설정은 부팅 후 5분후에 처음 실행되고, 이부터는 1시간 간격으로 실행된다.