리눅스 / crontab 사용법

리눅스에서 crontab을 사용하면 명령이나 스크립트를 정해진 시간에 반복 실행할 수 있습니다. crontab -e로 현재 사용자의 예약 작업을 편집하고, 시간 필드 다섯 개와 실행할 명령을 한 줄에 입력합니다.

cron과 crontab의 차이

cron은 예약된 작업을 정기적으로 확인하고 실행하는 서비스입니다. crontab은 실행 시각과 명령을 기록한 작업 목록이며, 일반적으로 사용자마다 별도로 관리됩니다. 이 글의 예제는 Debian과 Ubuntu 계열의 일반적인 사용자 crontab을 기준으로 합니다. 배포판과 cron 구현에 따라 설치 방법, 서비스 이름, 지원 기능이 다를 수 있습니다.

예약 작업은 해당 crontab의 소유자 권한으로 실행됩니다. 현재 사용자에게 없는 권한이 필요하다면 관리자와 실행 계정을 신중히 정하고, 권한이 불필요하게 넓은 작업을 만들지 마세요. 컴퓨터가 꺼져 있거나 cron 서비스가 중지된 동안에는 해당 시각의 작업이 실행되지 않습니다.

crontab 확인과 편집

터미널에서 다음 명령으로 현재 사용자의 예약 작업을 확인합니다. 목록이 없다는 메시지가 나오면 아직 해당 사용자의 crontab이 없는 것입니다.

crontab -l

작업을 추가하거나 수정하려면 다음 명령을 실행합니다. 처음 실행할 때 편집기 선택 화면이 나타날 수 있습니다. 파일을 저장하고 편집기를 종료하면 cron이 문법을 확인하고 새 목록을 설치합니다. 오류가 표시되면 안내에 따라 다시 편집하고, 설치되었다는 메시지를 확인하세요.

crontab -e

관리자 계정의 예약 작업은 현재 사용자와 별개입니다. 관리자 권한이 필요한 경우에만 sudo crontab -e로 root의 목록을 편집하고, sudo crontab -l로 확인합니다. 두 목록을 혼동하지 마세요.

작업 하나를 없앨 때는 crontab -e로 해당 줄만 삭제하고 저장합니다. crontab -r은 현재 사용자의 예약 작업 전체를 삭제하므로 사용하기 전에 목록을 확인하고 필요하면 안전한 위치에 백업하세요. crontab -l > ~/crontab-backup.txt로 백업하고, 복원이 필요할 때 crontab ~/crontab-backup.txt로 파일 전체를 다시 설치할 수 있습니다. 복원은 현재 목록을 덮어쓰므로 먼저 변경 사항을 확인하세요.

예약 시간의 형식

사용자 crontab의 각 작업은 시간 필드 다섯 개와 그 뒤의 명령으로 구성됩니다. 시스템 crontab인 /etc/crontab이나 /etc/cron.d/의 파일은 시간 필드와 명령 사이에 실행 사용자 필드가 추가되므로 아래 형식을 그대로 복사하지 마세요.

minute hour day-of-month month day-of-week command
필드 허용 범위 의미
minute 0–59 분
hour 0–23 시
day-of-month 1–31 날짜
month 1–12 월
day-of-week 0–7 요일. 0과 7은 일요일

*는 해당 필드의 모든 값을 뜻합니다. 쉼표는 여러 값(10,20), 하이픈은 범위(1-5), 슬래시는 범위 안의 간격(*/10)을 지정합니다. 예를 들어 분 필드의 */10은 매시 0, 10, 20, 30, 40, 50분입니다. 간격은 각 필드 안에서 해석되므로 경과 시간 기준으로 언제나 같은 간격을 보장하지는 않습니다.

날짜와 요일을 둘 다 제한하면 Debian cron에서는 두 조건 중 하나가 맞는 날에 실행됩니다. 예를 들어 0 4 1 * 1은 매월 1일과 매주 월요일 오전 4시에 실행되며, 1일이 월요일인 날에만 실행되는 것은 아닙니다. 자세한 형식은 시스템의 man 5 crontab 또는 Debian cron의 crontab 형식 설명서에서 확인할 수 있습니다.

예약 작업 예제

다음 예제의 /home/user/bin/backup.sh는 실제 스크립트의 절대 경로로 바꾸세요. 해당 사용자가 스크립트와 대상 파일에 접근할 권한이 있어야 하며, 스크립트를 직접 실행할 경우 실행 권한과 올바른 인터프리터 지정도 필요합니다. 먼저 터미널에서 같은 계정으로 실행하여 결과를 확인하세요.

0 4 * * * /home/user/bin/backup.sh
0 4 * * 1-5 /home/user/bin/backup.sh
*/10 4 * * * /home/user/bin/backup.sh

첫 줄은 매일 오전 4시, 둘째 줄은 월요일부터 금요일까지 오전 4시, 셋째 줄은 매일 오전 4시부터 4시 50분까지 10분마다 실행합니다. 예제는 각각 독립적인 일정입니다. 모두 입력하면 각 줄의 작업이 모두 등록됩니다.

안전하게 등록하고 실행 확인하기

실습할 때는 실제 백업 대신 현재 사용자의 홈 디렉터리에 실행 기록을 남기는 작업을 사용해 보세요.

  1. crontab -e를 실행하고 아래 한 줄을 추가한 뒤 저장하고 종료합니다. 매분 날짜와 시간이 파일에 추가됩니다.
* * * * * /bin/date >> "$HOME/cron-test.log" 2>&1
  1. crontab -l로 등록된 줄을 확인합니다. 1~2분 후 cat ~/cron-test.log로 기록이 추가되는지 확인합니다.
  2. 확인이 끝나면 crontab -e에서 실습 줄만 삭제하고 저장합니다. 필요 없는 기록 파일은 내용을 확인한 뒤 직접 삭제하세요.

실습이 동작하지 않으면 cron 서비스가 설치되어 실행 중인지 확인합니다. Ubuntu의 일반적인 cron 패키지에서는 systemctl status cron으로 상태를 볼 수 있습니다. 서비스 이름과 로그 위치는 배포판에 따라 다르며, Ubuntu에서 systemd 저널을 사용하는 환경이라면 journalctl -u cron으로 서비스 로그를 확인할 수 있습니다.

실행되지 않을 때 확인할 점

cron은 로그인 셸과 다른 환경에서 실행될 수 있습니다. 명령과 스크립트는 가급적 절대 경로로 지정하고, 필요한 환경 변수와 작업 디렉터리를 스크립트에 명시하세요. 오류를 확인하려면 작업의 출력과 오류를 사용자가 쓸 수 있는 로그 파일로 보내는 방법도 있습니다. 로그에는 민감한 정보가 포함될 수 있으므로 접근 권한과 보관 기간에 주의하세요.

시스템 시간과 시간대가 기대한 값인지, 실행 계정이 파일에 접근할 수 있는지, 작업이 겹쳐 실행될 가능성이 없는지도 확인하세요. 명령에 쓰는 %는 cron에서 특별하게 처리되므로 문자 그대로 전달하려면 일반적으로 \%로 이스케이프해야 합니다. 정확한 동작은 사용 중인 cron의 설명서를 확인하세요.