cron 은 리눅스의 작업 스케줄러로 정해진 시간이나 주기마다 특정 작업을 실행할 수 있습니다.

TL;DR

현재 등록한 작업 목록 보기

$ crontab -l
BASH


작업 등록

현재 로그인한 사용자의 cron 작업을 편집하려면 -e 옵션을 주고 실행합니다.

$ crontab -e
BASH

매일 실행

새벽 2시 15분에 ls 명령어를 실행하고 결과를 lesstif 에게 메일 전송

MAILTO=lesstif
15 02 * * * ls
BASH

주말에만 실행

토요일, 일요일만 cron 으로 ls 명령어 실행

15 02 * * 6,7 ls
BASH

매달 첫 날 명령어 실행

매달 첫 요일 오전 2시 15분에 ls 명령어 실행

15 02 1 * * ls
BASH


3달마다 특정 명령어 실행

let's encrypt 인증서 갱신등 몇 달마다 실행해야 하는 명령어를 cron에 설정할 수 있습니다.


1,  4, 7, 10월에 1일 새벽 2시에 인증서 갱신

00 02 01 Jan,Apr,Jul,Oct * /usr/bin/certbot renew --nginx
BASH


아래처럼 할수도 있지만 가독성이 떨어지므로 주석으로 최초 실행일을 적어주는 것이 좋습니다.

# 1, 4, 7, 10월에 실행
00 02 01 */3 * /usr/bin/certbot renew --nginx
BASH

주의 사항

cron 은 보안 문제때문에 shell 의 초기화 설정 파일(.bash_profile, .profile 등)을 읽지 않습니다.

그래서 시스템의 기본 PATH(/bin, /usr/bin) 에 없는 파일이나 공유 라이브러리(share library)를 사용하는 프로그램이라면 cron 을 통해 실행할 때 직접 환경 변수를 넣어줘야 합니다.

일반적으로 cron 을 사용할 때는 다음 규칙을 따르는 게 좋습니다.

실행은 별도 스크립트로 분리

간단한 명령이 아닐 경우 별도의 실행 script 를 작성해서 실행합니다.

즉 다음과 같이 직접 crontab 에 적어주는 것 보다는

crontab

* * * * rsync -avzht --progress SRC DST > /dev/null 2>&1
BASH

아래와 같이 my-rsync.sh 스크립트를 별도로 작성해 줍니다.

my-rsync.sh

#!/bin/bash

rsync -avzht --progress SRC DST >/dev/null 2>&1
BASH

그리고 crontab 에는 실행 스크립트의 절대 경로를 등록해 주는 게 좋습니다.

crontab

* * * * /home/lesstif/bin/my-rsync.sh
BASH


절대 경로 사용

실행하려는 프로그램을이 /bin/이나 /usr/bin 에 있지 않다면 절대 경로로 적어주는 게 좋습니다.

즉 /usr/local/bin/php74 를 실행시에는 php74 보다는 /usr/local/bin/php74 로 절대 경로로 명시하는 게 좋습니다.

#!/bin/bash  

/usr/local/bin/php74  /var/www/some-script.php
BASH


실행에 필요한 환경 변수 지정

PATH 나 LD_LIBRARY_PATH 등 프로그램 실행에 필요한 변수가 있다면 실행 스크립트안에 명시적으로 적어 주는 게 실수를 방지할수 있습니다.

예로 실행 프로그램이 /usr/local/lib64 에 있는 공유 라이브러리를 참고한다면 다음과 같이 실행 스크립트에 변수를 추가해 줘야 합니다.

my-rsync.sh

#!/bin/bash

LD_LIBRARY_PATH=/usr/local/lib64

/usr/local/bin/myprog option1 
BASH


공유 라이브러리에 대한 내용은 동적 라이브러리(shared library)와 Linker/Loader 이해하기 를 참고하세요.

cron 사용 권한 설정

같이 보기

Ref