리눅스 서버 운영중 익숙한 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://isntyet.tistory.com/121
https://chobowarrior.tistory.com/35
https://hippogrammer.tistory.com/75
https://twpower.github.io/213-systemd-timer-example
'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 |