[리눅스] 크론탭(crontab)을 이용한 작업 스케쥴링
업데이트:
크론탭(crontab)을 이용한 작업 스케쥴링
참고링크
관련 링크
- 운영체제와 커널의 차이
- bash란? #!/bin/bash의 의미
- bashrc와 bash_profile의 차이
- 컴파일러와 인터프리터의 차이
- 리다이렉션, 파이프의 개념
- 크론탭(crontab)을 이용한 작업 스케쥴링
1. 크론탭의 개념
1.1. 크론탭(crontab)이란?
크론탭(crontab)은 리눅스 운영체제에서 배치 작업을 스케쥴링 하기 위한 프로그램 입니다. 크론탭을 이용하면 특정 시각에 작업이 실행되게끔 할 수도 있고, 정기적인 작업 스케쥴링을 할 수도 있습니다.
1.2. 크론탭 설치
그럼 크론탭을 설치해보겠습니다. 저는 우분투 환경에서 설치해보도록 하겠습니다. 설치는 다음과 같은 명령어를 입력합니다.
$ sudo apt install cron
설치를 했다면 크론탭의 상태를 봅니다.
$ sudo service cron status
만약 위에서 명령한 status를 보고 상태가 active 이면 따로 할일은 없고, 만약 active가 아니라면 크론탭을 시작해줘야합니다. 크론탭 서비스 시작은 다음과 같은 명령어를 입력합니다.
$ sudo service cron start
2. 크론탭 명령어
2.1. 작업 할당
크론탭을 이용해 작업을 할당할때는 다음 커맨드를 입력합니다.
$ crontab -e
위 커맨드를 입력하면 vim과 같은 텍스트 편집기가 열리는데(만약 첫 실행이면, nano사용할 것인지, vim사용할 것인지 물음) 텍스트 편집기를 이용해 작업을 할당하면 됩니다. 구체적인 작업 할당 방법은 잠시 후에 알아보겠습니다.
2.2. 할당된 작업 리스트 확인
현재 어떤 작업이 할당되어 있는지 확인하는 방법은 다음 커맨드를 입력하면 됩니다.
$ crontab -l
3. 작업 할당 방법
크론탭에서는 텍스트 입력을 통해 작업을 할당하는데 할당하는 포맷은 다음과 같습니다.
* * * * * source /home/dlit/work/pred_batch.sh
위 명령어는 매분 source /home/dlit/work/pred_batch.sh
명령어를 실행하라는 뜻입니다.
커맨드를 보면 별 표시가 5개 있는데 이 별 표시는 반복실행 주기를 의미합니다.
별 다섯개는 순서대로 다음을 의미합니다.
* * * * *
분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
즉 위와 같이 모두 별표시면 매분, 매시간, 매일, 매월, 매요일을 의미합니다. 요일은 0, 7은 일요일을 의미하며 월요일은 1, 토요일은 6에 해당합니다.
23 15 17 5 * source /home/dlit/work/pred_batch.sh
즉 위와 같은 코드는 5월 17일 오후 3시 23분에 해당 스크립트를 돌리라는 의미입니다.
5 2 * * * source /home/dlit/work/pred_batch.sh
위 코드는 매일 오전 2시 5분에 스크립트를 돌리라는 의미입니다.
5. 크론탭 실행 중인지 확인하고 재시작하기
5.1. 크론탭 실행 중인지 확인 방법(1)
우선 다음과 같은 방법으로 크론탭이 실행중인지 확인할 수 있습니다.
$ sudo service cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-12-26 11:18:04 KST; 3h 52min ago
Docs: man:cron(8)
Main PID: 2256741 (cron)
Tasks: 1 (limit: 76648)
Memory: 9.2M
CGroup: /system.slice/cron.service
└─2256741 /usr/sbin/cron -f
위 결과를 보면 active 상태인 것으로 보아 크론탭이 잘 실행되고 있는 것을 알 수 있습니다.
5.2. 크론탭 실행 중인지 확인 방법(2)
혹은 다음과 같이 간단히 확인할 수도 있습니다.
$ pgrep cron
2256741
위 결과처럼 프로세스id가 출력되면 크론탭이 잘 실행이 되고 있는 것이고, 만약 아무것도 출력되지 않는 다면 크론이 실행중인 것이 아닙니다.
5.3. 크론탭 재시작
만약 크론탭을 재시작, 재가동 하고 싶다면 다음과 같은 커맨드를 입력합니다.
$ sudo service cron restart
6. 나노 에디터를 vim 으로 변경
crontab
이 nano
에디터로 설정되어 있는 경우 다음과 같이 vim
으로 변경 가능합니다.
export VISUAL=vim
또는 다음과 같은 방법도 사용 가능
export EDITOR=vim
7. 크론탭이 제대로 작동하는지 테스트 하기
crontab -e
를 통해 내부에 다음과 같이 입력합니다.
SHELL=/bin/bash
* * * * * env > /tmp/env.output
위 커맨드는 매분 환경변수를 tmp/env.output
에 저장하라는 배치 작업인데,
위 내용을 저장하고 1분후에 tmp/env.output
파일을 확인하면 다음과 같은 결과를 볼 수 있습니다.
$ cat /tmp/env.output
SHELL=/bin/bash
PWD=/home/dlit
LOGNAME=dlit
HOME=/home/dlit
LANG=en_US.UTF-8
SHLVL=1
PATH=/usr/bin:/bin
_=/usr/bin/env
위 결과처럼 결과가 잘 나오는 것으로 보아 crontab은 잘 작동하고 있다는 것을 볼 수 있습니다.
8. 파이썬 파일을 크론탭으로 등록하기
8.1. 디렉토리 확인
다음과 같은 디렉토리가 있다고 하겠습니다.
$ ll
total 20
drwxrwxr-x 2 dlit dlit 4096 Dec 26 11:21 ./
drwxrwxr-x 6 dlit dlit 4096 Jul 4 11:35 ../
-rw-rw-r-- 1 dlit dlit 1605 Dec 26 09:37 daily_predict.py
-rw-rw-r-- 1 dlit dlit 0 Jul 4 08:16 nohup.log
-rw------- 1 dlit dlit 446 Jul 29 08:05 nohup.out
-rwxrwxrwx 1 dlit dlit 238 Dec 26 10:43 pred_batch.sh*
-rw-rw-r-- 1 dlit dlit 0 Dec 26 11:21 pred_batch.sh.log
우리가 하고자 하는 것은 위 pred_batch.sh
파일을 크론으로 매일 실행시키는 것입니다.
pred_batch.sh
파일은 777 권한(chmod 777)을 가지고 있고, 다음과 같이 작성되어 있습니다.
#!/bin/bash
source /home/dlit/.bashrc
source /home/dlit/.profile
pyenv activate py3_9_8
cd /home/dlit/work/living_paradise/daily_batch
nohup python ./daily_predict.py > /dev/null 2>&1 &
#python ./daily_predict.py
source deactivate
위 코드를 보면 pred_batch.sh
파일은 daily_predict.py
파일을 실행하는 쉘 스크립트라는 것을 알 수 있습니다.
따라서 가장 먼저 해야할 일은 daily_predict.py
파일을 실행해보는 것입니다.
8.2. 파이썬 파일 실행
가장 먼저 daily_predict.py
파일을 실행해보겠습니다.
다음과 같이 pyenv
를 통해 가상환경을 실행하고 daily_predict.py
파일을 실행합니다.
$ pyenv activate py3_9_8
(py3_9_8)$ python daily_predict.py
실행완료
(py3_9_8)$ source deactivate
$
위와 같이 문제 없으면 다음 단계로 pred_batch.sh
파일을 실행해봅시다.
8.3. 쉘스크립트 파일 실행
이번에는 pred_batch.sh
파일을 실행해봅시다.
쉘 스크립트 파일은 다음과 같이 실행합니다.
$ bash pred_batch.sh
위 스크립트가 잘 실행이되면 마지막으로 크론탭에 등록하겠습니다.
8.4. 크론탭 등록
마지막 단계로 크론탭에 등록하겠습니다. 크론탭 등록은 다음과 같이 합니다.
$ crontab -e
SHELL=/bin/bash
30 02 * * * /home/dlit/work/living_paradise/daily_batch/pred_batch.sh
4. 크론탭 에러 메시지(1)
스케쥴링을 걸어놨는데 다음과 같은 에러가 날때가 있다.
/bin/sh: 1: source: not found
위 로그는 source
명령어를 찾을 수 없다는 소리인데,
이는 crontab이 실행되는 기본 쉘이 /bin/sh
인데,
/bin/sh
에서는 source 명령어를 지원하지 않습니다.
따라서 source 명령어를 사용할 수 없으므로 저런 에러가 나는 것입니다.
해결 방법은 다음 둘중 하나를 하면 됩니다.
4.1. 해결방법(1) 쉘 바꾸기
crontab -e
에서 다음과 같이 쉘을 지정하는 커맨드를 입력해줍니다.
SHELL=/bin/bash
5 2 * * * source /home/dlit/work/pred_batch.sh
4.2. 해결방법(2) 마침표 사용
두번째 방법은 source 명령어 대신 마침표를 사용하는 것입니다.
5 2 * * * . /home/dlit/work/pred_batch.sh