corntab을 이용하여 루틴한 작업을 돌리고있었는데

systemd로 옮겨야하는 상황이 왔다. (단순히 php파일 하나 실행하면되는 거라 안 옮겨도 되지만 어쨌든 옮기게됬다)


검색을해서 보니 서비스를 만들어서 해당 서비스를 스타트 시키면 된다고 하여 일단 서비스 파일을 만들었다.


/etc/systemd/system  위치에 일단 service_name.service 라는 파일을 만들고

실행할 내용을 기입했다.



/etc/systemd/system/service_name.service


[Unit]
Description=aws check...haha

[Service]
Type=simple
WorkingDirectory=/var/www/html/tmp.test.com/Model/testAPI
ExecStart=/usr/bin/php /var/www/html/tmp.test.com/Model/testAPI/billing.php

[Install]
WantedBy=default.target


만들고 보니 crontab의 * * * * *  처럼 몇일날 어느시에 실행하는 기능이 없었다..

Restart=always

RestartSec=3600
위와 같은 실행이 끝나고 몇초뒤에 재실행할 것인지를 설정하는 기능은 있었지만

service자체 내에서는 [특정 날 ,특정 시 에 실행하겠다] 라는 설정을 할 수 없었다.


방법을 찾아보니 service가 아닌 timer라는 unit이 있었다.

이 timer를 이용하면 crontab과 같은 기능을 수행할 수 있었다.


우선 같은 경로에 service_name_timer.timer 라고 파일을 만들고 내용을 작성하였다.


/etc/systemd/system/service_name_timer.timer


[Unit]
Description=smi aws billing timer (AM: 08:00)

[Timer]
OnCalendar=*-*-* 23:00:01
Persistent=True
Unit=service_name.service

[Install]
WantedBy=default.target

[Timer]의 Oncalendar에 실행시킬 time을 형식에 맞게 입력해주고

Unit에 실행시킬 서비스를 입력해주면 된다. (기타 다른 옵션은 따로 검색해보세요)


나같은 경우는 매년 매월 매일 am 8시에 해당 서비스를 돌리고 실행시키고 싶었는데

*-*-* 은 년,월,일 이고 23:00:01은 시분초 이다. (나같은 경우는 서버시간이 utc 0이라 시간에서 9를 뺐다)


ex)----------------------------------------
매일 매시 5분에 돌리고싶다~~     ===    *:05:00
매년 3월 1일 11시에 돌리고 싶당    ===   *-03-01 11:00:00

--------------------------------------------

이런식으로 작성해 주면된다.


작성을 하고 저장한다음에

sudo systemctl enable service_name_timer.timer
하여 부팅시 실행되게 해놓은다음

sudo systemctl start service_name_timer.timer
를 하면 타이머가 시작되면서 설정한 시간에 Unit에 설정해놓은 .service를 실행해주게 된다.


timer가 잘 등록이 되었는지, 언제실행되었는지, 언제 실행될건지를 보려면

systemctl list-timers

를 이용하면되고


서비스가 정상적으로 실행되었는지 로그를 보고싶다면

journalctl -r -u service_name.service

이렇게 journalctl를 이용해 로그를 확인을 해주면된다.


+ Recent posts