리눅스 서버 운영중 익숙한 crontab을 이용한 스케줄 작업을 진행 하지 못하는 경우 systemd.timer를 이용해서 스케줄 작업을 진행 할 수 있습니다.
리눅스 서비스 관리에 스케줄이 포함된 작업 방식 입니다.

root, user에 대한 서비스를 등록 및 운영 할 수 있어 crontab과 동일한 환경으로 스케줄을 운영 할 수 있습니다.

기본적인 사용방법은 아래와 같습니다.(root계정 기준)
/etc/systemd/system 하위 폴더로 이동시 하위에 이미 동작하고 있는 기본 리눅스 service 및 timer설정을 확인 할 수 있습니다.
저희는 해당 폴더 하위네 .service 와 해당 서비스를 스케줄할 .timer를 생성하고 등록 및 사용할 예정 입니다.

해당 폴더에 임의의 service_name.service, service_name.timer 2개의 파일을 생성 하고 

service_name.service

[Unit]
Description=test service

[Service]
Type=simple
WorkingDirectory=/root/testwork
ExecStart=/root/testwork/date_service.sh

[Install]
WantedBy=multi-user.target


service_name.timer

[Unit]
Description=test timer

[Timer]
OnBootSec=1min
OnCalendar=*-*-* 01:00:00
Unit=service_name.service

[Install]
WantedBy=multi-user.target

이라는 2개의 파일을 생성 해줍니다. ExecStart의 date_service.sh 파일은
안래와 같은 내용으로 동작 확인을 위한 내용으로 등록 했습니다.

#!/bin/bash
date >> /root/testwork/date.log


2개의 파일을 생성 후 


systemctl start service_name.timer
명령어를 실행 하면 해당 타이머가 실행 됩니다.
(타이머가 지정한 서비스가 설정에 맞춰 주기적으로 동작 하게 됩니다.)

실행 하려는 서비스를 찾지 못하는 경우 아래의 명령어를 실행 후 다시 start해주시면 됩니다.
systemctl daemon-reload

service 및 timer파일에 대한 간략한 내용을 설명 하면 아래와 같습니다.
[Unit]
Description=test service <-- 해당 서비스 설명

[Service]
Type=simple <-- 서비스 실행 방식 기본은 simple이고 해당 방식은 서비스의 정상 동작 여부 상관 없이 실행 후 해당 서비스가 정상이라고 가정 합니다.
WorkingDirectory=/root/testwork <-- 서비스 동작 폴더
ExecStart=/root/testwork/date_service.sh <-- 서비스 동작시 실행 되는 명령

[Install]
WantedBy=multi-user.target <-- 서비스 동작시 의존성(?) 참고할 install그룹 다른 분들 글을 보면
해당 부분에 default.target을 작성 하는 경우도 있는데 해당 내용은 아래 링크들을 보면 자세히 나와 있습니다.
가장 많이 나요는 내용을 요약하면 WantedBy에서 지정하는 install요소는 7(0~6)개로 구성되어 있고 리눅스 서버의 시작시
진행 상태와 연관이 있습니다. multi-user.target은 리눅스 서버의 3번 레벨로 텍스트 서비스 구성이 완료되는 시점을 이야기 합니다.(이 시점에 네트워크 등의 연결이 활성화 됩니다.)
default.target은 리눅스 서버에 기본으로 잡혀 있는 시점으로 
systemctl get-default 명령으로 확인 할 수 있고 해당 내용을 테스트한 gcp vm서버의 경우 grapchical.target 으로 되어 있었습니다.
해당 시점은 5번 레벨로 GUI 인터페이스 관련 서비스가 가능한 시점 입니다.
해당 설정은 타이머 나 서비스를 리눅스 시작 시점에 실행 시키는 systemctl enable 명령과 연관된 설정이라서 
몇몇 분들의 테스트 코드에는 없는 경우도 있습니다.

[Unit]
Description=test timer <-- 설명

[Timer]
OnBootSec=1min <-- 리눅스 부팅 후 얼마의 시간이 흐르고 실행 할지
OnCalendar=*-*-* 01:00:00 <-- 실행 스케줄 년_월_일 시:분:초 5분단위로 작업 하고자 하는 경우 OnCalendar=*:*:5
등록 하려는 스케줄의 경우 (systemd-analyze calendar "*-*-* 01:00:00") 명령으로 동작 여부를 확인 할 수 있습니다.
Unit=service_name.service <-- 타이머가 실행할 서비스 명

[Install]
WantedBy=multi-user.target <-- 관련 target



추가로 서비스는 root뿐만 아니라 user 로도 실행이 가능하고 이 경우 .service .timer 파일은 
/home/user name폴더/.config/systemd/user 폴더 하위로 생성 되어야 합니다.
(해당 폴더가 없는경우 systemd폴더 부터 만든 후 작업 하시면 됩니다.)
.config폴더가 보이지 않는 경우 숨김 폴더도 보이는 ls -al 명령으로 확인 후 들어가셔도 되고 그냥 cd /home/username폴더/.config 로 이동 하셔도 됩니다.

해당 폴더에 service 및 timer파일을 생성하고 나서는 실행 명령에 --user 옵션만 추가하면 서비스를 스케줄 할 수 있습니다.
아래는 systemd.timer 설정시 사용하는 명령어 및 설명 입니다.


systemctl list-timers --> 실행중인 스케줄 목록을 확인

systemctl status service_name.timer --> 스케줄의 상태를 확인

systemctl start service_name.timer --> 스케줄을 실행

systemctl stop service_name.timer --> 스케줄을 중지

systemctl enable service_name.timer --> 스케줄을 리눅스 시작시 실행되게 서비스 등록

systemctl disable service_name.timer --> 등록된 스케줄 중지

journalctl -r -u service_name.service --> 서비스 동작 로그 확인(에러가 발생되는지 여기에서 확인 가능 합니다.)

systemctl daemon-reload --> 서비스 목록 갱신(서비스 파일을 못찾는다고 나오면 실행)

systemd-analyze calendar "*-*-* 01:00:00" --> 스케줄 설정 동작 확인

위의 내용을 user에서 실행 하는경우 아래와 같습니다.

systemctl --user list-timers
systemctl --user status service_name.timer
systemctl --user start service_name.timer
systemctl --user stop service_name.timer
systemctl --user enable service_name.timer
systemctl --user disable service_name.timer
journalctl --user -r -u service_name.service
systemctl --user daemon-reload

추가로 user의 경우 콘솔 접속이 종료되는 경우 실행중인 서비스도 같이 종료되기 때문에 root계정으로 아래의 명령어를 실행 해서 
서비스가 유지되게 작업 해줘야 합니다.

loginctl enable-linger 사용자계정

 

https://blog.o3g.org/tips/cron-%EB%8C%80%EC%8B%A0-systemd-timer-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

 

cron 대신 systemd.timer 사용하기 : 오픈 인프라 엔지니어 그룹

그동안 반복 스케쥴 작업은 Cron (혹은 Crond, Crontab)에 의해 실행되는게 당연시되었습니다. systemd 에서는 cron 작업과 동일하게 반복적인 스케쥴을 timer를 통해 실행할 수 있습니다. systemd.timer는 cron

blog.o3g.org

https://isntyet.tistory.com/121

 

(centos7) systemd timer

corntab을 이용하여 루틴한 작업을 돌리고있었는데 systemd로 옮겨야하는 상황이 왔다. (단순히 php파일 하나 실행하면되는 거라 안 옮겨도 되지만 어쨌든 옮기게됬다) 검색을해서 보니 서비스를 만

isntyet.tistory.com

https://chobowarrior.tistory.com/35

 

systemd timer

필자는 리눅스에서 반복 작업을 하기 위해서 주로 cron을 사용해 왔다. 하지만, 필자가 사용하는 리눅스에서는 cron이 기본으로 설치되어 있지 않아 패키지 매니저를 이용해 설치

chobowarrior.tistory.com

https://hippogrammer.tistory.com/75

 

Systemd Target 사용

Systemd Target은 CentOS 7 이전 버전에서 사용하는 runlevel과 비슷한 개념이다. CentOS 7 이전 버전에서의 runlevel은 리눅스 시스템이 어떤 상태에서 실행되어야 하는지를 결정하기 위해서 사용하는 명령

hippogrammer.tistory.com

https://twpower.github.io/213-systemd-timer-example

 

[Linux] systemd service timer 예제

Practice makes perfect!

twpower.github.io

https://springboot.cloud/16

 

systemd 서비스 unit파일 작성에서 했던 실수

요즘 kafka, elasticsearch, vertica, ansible 등등등을 깔고 연동하고 하는 일을 많이하다보니 자연스럽게 이걸 시스템 서비스로 작성하는 것들도 하게 되었다. 그러면서 몇 가지 삽질을 한 것에 대해서

springboot.cloud

 

반응형

'OS > 리눅스' 카테고리의 다른 글

ubuntu docker 설치  (0) 2022.03.02
ubuntu18 doker설치 관련 에러(repository 문제)  (1) 2022.03.02
crontab 명령어 실행시 계정 변경  (0) 2017.06.21
링크 폴더 생성  (0) 2016.11.22
ssh/sftp 포트 지정  (0) 2016.02.18
Posted by 질주하는구
,