리눅스 스케줄러 크론탭 사용법(Linux scheduler crontab)
cron 은 리눅스의 작업 스케줄러로 정해진 시간이나 주기마다 특정 작업을 실행할 수 있습니다.
TL;DR
- https://crontab.guru/ 에서 cron job 을 등록하고 실행 주기를 확인할 수 있습니다.
현재 등록한 작업 목록 보기
$ crontab -l
작업 등록
현재 로그인한 사용자의 cron 작업을 편집하려면 -e 옵션을 주고 실행합니다.
$ crontab -e
매일 실행
새벽 2시 15분에 ls 명령어를 실행하고 결과를 lesstif 에게 메일 전송
MAILTO=lesstif 15 02 * * * ls
주말에만 실행
토요일, 일요일만 cron 으로 ls 명령어 실행
15 02 * * 6,7 ls
매달 첫 날 명령어 실행
매달 첫 요일 오전 2시 15분에 ls 명령어 실행
15 02 1 * * ls
3달마다 특정 명령어 실행
let's encrypt 인증서 갱신등 몇 달마다 실행해야 하는 명령어를 cron에 설정할 수 있습니다.
1, 4, 7, 10월에 1일 새벽 2시에 인증서 갱신
00 02 01 Jan,Apr,Jul,Oct * /usr/bin/certbot renew --nginx
아래처럼 할수도 있지만 가독성이 떨어지므로 주석으로 최초 실행일을 적어주는 것이 좋습니다.
# 1, 4, 7, 10월에 실행 00 02 01 */3 * /usr/bin/certbot renew --nginx
주의 사항
cron 은 보안 문제때문에 shell 의 초기화 설정 파일(.bash_profile, .profile 등)을 읽지 않습니다.
그래서 시스템의 기본 PATH(/bin, /usr/bin) 에 없는 파일이나 공유 라이브러리(share library)를 사용하는 프로그램이라면 cron 을 통해 실행할 때 직접 환경 변수를 넣어줘야 합니다.
일반적으로 cron 을 사용할 때는 다음 규칙을 따르는 게 좋습니다.
실행은 별도 스크립트로 분리
간단한 명령이 아닐 경우 별도의 실행 script 를 작성해서 실행합니다.
즉 다음과 같이 직접 crontab 에 적어주는 것 보다는
* * * * rsync -avzht --progress SRC DST > /dev/null 2>&1
아래와 같이 my-rsync.sh 스크립트를 별도로 작성해 줍니다.
#!/bin/bash rsync -avzht --progress SRC DST >/dev/null 2>&1
그리고 crontab 에는 실행 스크립트의 절대 경로를 등록해 주는 게 좋습니다.
* * * * /home/lesstif/bin/my-rsync.sh
절대 경로 사용
실행하려는 프로그램을이 /bin/이나 /usr/bin 에 있지 않다면 절대 경로로 적어주는 게 좋습니다.
즉 /usr/local/bin/php74 를 실행시에는 php74 보다는 /usr/local/bin/php74 로 절대 경로로 명시하는 게 좋습니다.
#!/bin/bash /usr/local/bin/php74 /var/www/some-script.php
실행에 필요한 환경 변수 지정
PATH 나 LD_LIBRARY_PATH 등 프로그램 실행에 필요한 변수가 있다면 실행 스크립트안에 명시적으로 적어 주는 게 실수를 방지할수 있습니다.
예로 실행 프로그램이 /usr/local/lib64 에 있는 공유 라이브러리를 참고한다면 다음과 같이 실행 스크립트에 변수를 추가해 줘야 합니다.
#!/bin/bash LD_LIBRARY_PATH=/usr/local/lib64 /usr/local/bin/myprog option1
공유 라이브러리에 대한 내용은 동적 라이브러리(shared library)와 Linker/Loader 이해하기 를 참고하세요.
cron 사용 권한 설정
같이 보기
- https://crontab.guru/ - 온라인 cron 스케줄 에디터
- cron 사용법
- /wiki/spaces/SADM/pages/889258105
- cron 작업이 실패했을때만 이메일 전송하기
- cron 설정
- 공유 라이브러리 의존성(shared library dependencies)을 출력하는 linux ldd 사용법