리눅스 crontab 한 번에 끝내기: 옵션 6개 · 시간 표현식 · 작성 예시 8개
백업 스크립트 실행, 오래된 로그 정리, 주기적인 데이터 수집처럼 리눅스 서버에서 반복적으로 처리해야 하는 작업이 생길 때 가장 먼저 떠올리는 도구가 crontab입니다. 별도의 스케줄러 애플리케이션 없이 명령 한 줄로 예약 작업을 등록할 수 있어, 리눅스를 다루는 실무 환경에서 오랫동안 폭넓게 활용되고 있습니다. 2021년 1월에 실무에서 직접 정리해 두었던 내용을 이번에 다시 다듬었습니다. 이 글에서는 crontab 옵션, 시간 표현식(분·시·일·월·요일), 실전 예시 8가지, 로그 확인 패턴을 순서대로 다룹니다.
1. crontab이란
crontab은 cron 데몬이 읽는 예약 작업 설정 파일이자, 그 파일을 편집하는 명령어입니다.
- cron (또는 crond): 백그라운드에서 상시 실행되는 데몬(daemon) 프로세스. 주기적으로 crontab 파일을 읽어 지정된 시간에 명령을 실행합니다.
- crontab: cron 데몬이 사용하는 설정 파일 형식이자, 그 파일을 등록·편집하는
crontab명령어입니다.
cron 데몬 (백그라운드 상시 실행)
↓ [주기적으로 읽음]
crontab 파일 (/var/spool/cron/crontabs/{user})
↓ [해석하여 실행]
지정된 시간에 명령 실행
정기 백업, 로그 정리, 반복 스크립트 자동 실행처럼 주기적으로 처리해야 하는 예약·반복 작업을 자동화할 때 활용합니다.
그럼 crontab을 다루는 명령 옵션부터 살펴보겠습니다.
2. crontab 옵션 6가지
crontab 명령에서 직접 사용하는 플래그는 5가지이며, cron 데몬 재시작 명령어를 더해 총 6가지를 정리합니다.
| 명령어 | 의미 |
|---|---|
crontab -u user | 사용자 지정 (root가 특정 사용자의 crontab 파일을 다룰 때) |
crontab -e | crontab 파일 작성·편집 |
crontab -l | 현재 등록된 작업 목록 표시 |
crontab -r | 등록된 작업 전체 삭제 |
crontab -i | -r과 같지만 삭제 전에 yes/no 확인 |
-l로 현재 등록된 작업 목록을 수시로 확인할 수 있습니다. -r은 등록된 작업 전체를 즉시 삭제하므로 주의가 필요합니다. 삭제 전 yes/no 확인 단계가 필요하다면 -i를 사용하면 됩니다.
cron 데몬 재시작 — 등록 후 변경 사항이 즉시 반영되지 않는다면 cron 데몬을 재시작합니다. 최신 Linux 배포판(systemd 기준)에서는 아래 명령을 사용합니다.
# Debian / Ubuntu
systemctl restart cron
# CentOS / RHEL
systemctl restart crond
옵션을 파악했다면, 이제 실제로 편집 화면을 열어 보겠습니다.
3. crontab -e로 진입하고 저장하기
예약 작업을 등록하려면 먼저 crontab -e 명령으로 편집 화면에 진입합니다.
crontab -e

편집 화면은 vim 에디터로 열립니다. 내용을 작성한 뒤 저장하고 나오려면 ESC를 한 번 누르고 :wq!를 입력한 다음 Enter를 누르면 됩니다. vim 기본 조작이 익숙하지 않다면 아래 관련 글을 함께 참고하면 도움이 됩니다.
편집 화면에 진입했다면, 핵심 문법인 시간 표현식을 이해할 차례입니다.
4. 시간 표현식 — 분 시 일 월 요일
crontab 설정 줄은 분 시 일 월 요일 명령어 순으로 작성합니다. 각 필드의 허용 범위는 다음과 같습니다.
| 분 | 시 | 일 | 월 | 요일 | 명령어 |
|---|---|---|---|---|---|
| 0~59 | 0~23 | 1~31 | 1~12 | 0~7 | ex) job.sh |
요일 필드는 0과 7이 모두 일요일을 의미합니다. 매핑은 다음과 같습니다.
0(일) · 1(월) · 2(화) · 3(수) · 4(목) · 5(금) · 6(토) · 7(일)
특정 필드를 제한 없이 실행하고 싶을 때는 *(와일드카드)를 씁니다.
실무 팁
- 요일 0과 7은 동일: 둘 다 일요일을 가리키므로 어느 쪽을 써도 동작합니다.
- 일(day)과 요일(weekday) 동시 지정 주의: 두 필드를 함께 쓰면 AND가 아닌 OR 조건으로 동작합니다. 예를 들어
0 5 1 * 1은 “매월 1일이거나 매주 월요일인 날 오전 5시”에 실행됩니다. 의도치 않은 실행 횟수 증가를 주의하세요.
시간 표현식을 이해했다면, 실제 작성 예시로 바로 적용해 보겠습니다.
5. 작성 예시 8가지
아래 예시에서 /home/usr/python/... 경로는 원문의 표본 경로입니다. 실제 환경에 맞춰 수정해서 사용하면 됩니다. 예시에서는 쉼표(,), 슬래시(/), 하이픈(-) 세 가지 기호를 활용합니다. 각 기호의 의미는 예시 아래에서 설명합니다.
5.1 기본 패턴 (매분 · 매주 · 매월 · 매년)
# 매분 마다 실행
* * * * * /home/usr/python/job.sh
# 매주 월요일 오전 5시 10분에 실행
10 5 * * 1 /home/usr/python/job.sh
# 매월 1일 5시에 실행
00 5 1 * * /home/usr/python/job.sh
# 매년 1월 1일 5시에 실행
00 5 1 1 * /home/usr/python/job.sh
<em> </em> <em> </em> *— 모든 필드에 와일드카드: 매분 실행. 가장 빠른 주기.10 5 <em> </em> 1— 요일 필드에1(월요일) 지정: 매주 월요일 오전 5시 10분 실행.00 5 1 <em> </em>— 일 필드에1지정: 매월 1일 오전 5시 실행. 월초 정기 작업에 적합.00 5 1 1 *— 일·월 필드를 모두 지정: 매년 1월 1일 오전 5시 실행.
5.2 시간 범위·조합 (쉼표 · 슬래시 · 하이픈)
# 매시간 0분, 20분, 40분에 실행
0,20,40 * * * * /home/usr/python/job.sh
# '/' 를 사용해서 설정 (20분 마다 실행)
*/20 * * * * /home/usr/python/job.sh
# 매일 3시부터 3시 30분까지 매분 실행
0-30 3 * * * /home/usr/python/job.sh
0,20,40— 쉼표로 여러 시각을 나열: 0분·20분·40분이라는 특정 시각 3개를 명시.*/20— 슬래시로 간격 지정: 0분부터 20분 간격으로 반복 실행 (0·20·40분).0-30— 하이픈으로 범위 지정: 0분~30분 사이 매분 실행.
0,20,40과 */20의 차이: 두 표현식의 실행 시각은 같아 보이지만 의미가 다릅니다. , 방식은 “실행할 시각을 직접 명시”하는 것이고, / 방식은 “간격”을 표현하는 것입니다. 실행 시각을 명확히 고정하고 싶다면 , 방식, 간격의 의도를 드러내고 싶다면 / 방식을 씁니다.
5.3 복합 조건 (범위 + 리스트 조합)
# 1일에서 3일까지 3시4시5시에 20분마다 실행
*/20 3,4,5 1-3 * * /home/usr/python/job.sh
- 시 필드(
3,4,5)에 쉼표로 여러 시각을 지정하고, 일 필드(1-3)에 하이픈으로 범위를 지정한 복합 조건 예시입니다. 매월 1~3일에, 3시·4시·5시 동안, 20분 간격으로 실행됩니다.

예시를 등록한 뒤에는 실제로 작업이 실행됐는지 로그로 확인할 수 있습니다.
6. 로그 확인·저장·끄기
6.1 로그 확인 (누적·실시간)
# crontab 로그 확인 (RedHat/CentOS 기준; Debian/Ubuntu는 /var/log/syslog)
cat /var/log/cron
# 실시간 로그 확인
tail -f /var/log/cron
cat /var/log/cron— 누적된 실행 로그 전체를 한 번에 확인합니다.tail -f /var/log/cron— 로그 끝 부분을 실시간으로 스트리밍해 확인합니다.
6.2 로그 저장 및 비활성화
# /home/usr/python/log/log.txt 파일에 저장하기
* * * * * /home/usr/python/job.sh > /home/usr/python/log/log.txt 2>&1
# 로그 남기지 않기
* * * * * /home/usr/python/job.sh > /dev/null 2>&1
> log.txt 2>&1— 표준 출력과 표준 에러를 모두 파일에 저장합니다.2>&1은 표준 에러(파일 디스크립터 2번)를 표준 출력(파일 디스크립터 1번)으로 합치는 패턴입니다.> /dev/null 2>&1— 출력을 모두 버려 로그를 남기지 않습니다.
7. 초보자가 자주 겪는 실수 2가지
문법과 로그 확인까지 익혔다면 대부분의 예약 작업은 등록할 수 있습니다. 다만 crontab을 처음 다룰 때 거의 예외 없이 한 번씩 겪는 함정이 두 가지 있습니다. 미리 알아두면 초기 트러블슈팅 시간을 크게 줄일 수 있습니다.
7.1 환경 변수(PATH) 누락
터미널에서는 잘 실행되던 명령이 crontab에서만 동작하지 않는다면, 대부분 환경 변수(PATH) 차이가 원인입니다. 터미널 세션에는 /usr/local/bin이나 사용자 홈 아래 bin 경로 등이 PATH에 포함돼 있지만, crontab은 기본적으로 /usr/bin:/bin만 사용합니다. 절대 경로 없이 명령 이름만 입력하면 crontab이 해당 명령을 찾지 못해 실패합니다.
해결 방법은 두 가지이며, 둘 중 하나만 적용하면 됩니다.
# 방법 1 — crontab 파일 상단에 PATH를 직접 지정
PATH=/usr/local/bin:/usr/bin:/bin
# 방법 2 — 명령에 절대 경로 사용
0 5 * * * /usr/bin/python3 /home/usr/python/job.py
- 방법 1 — crontab 파일 맨 위에
PATH를 선언해 두면 이후 모든 작업이 해당 경로를 참조합니다. 등록 항목이 여러 개일 때 편리합니다. - 방법 2 — 명령과 스크립트를 절대 경로로 지정합니다. 항목별로 명확하게 통제하고 싶을 때 유용합니다.
7.2 로그 리다이렉션 누락
>나 2>&1 없이 작업을 등록하면 실행 결과가 로컬 메일 박스로 전송되거나 아예 사라집니다. 스크립트에서 오류가 발생해도 어디서 왜 실패했는지 확인할 방법이 없어 디버깅이 막막해집니다. 등록 초기에는 반드시 로그 파일 경로와 2>&1을 함께 붙여 두세요.
# 로그를 파일에 누적 저장 (stderr 포함)
* * * * * /home/usr/python/job.sh >> /home/usr/python/log/log.txt 2>&1
>>(이중 꺾쇠) — 기존 내용 뒤에 추가(append)되어 로그가 누적됩니다. 실행 이력을 남기려면 이쪽을 사용합니다.>(단일 꺾쇠) — 실행할 때마다 파일을 덮어씁니다. 마지막 실행 결과만 남습니다.
마무리
crontab은 한 번 익혀 두면 반복 작업이 생길 때마다 바로 쓸 수 있는 도구입니다. 아래 순서로 직접 등록해 보세요.
crontab -e— 편집 화면에 진입합니다.- 매분 실행 예시(
<em> </em> <em> </em> * echo "cron test")를 한 줄 입력하고:wq!로 저장합니다. crontab -l— 등록된 목록을 확인합니다.tail -f /var/log/cron— 실시간 로그로 작업 실행 여부를 확인합니다.
처음에는 간단한 echo 명령으로 동작을 확인한 뒤, 실제 백업·로그 정리 스크립트로 교체해 나가면 됩니다.
참고 · 출처
- 출처: freeblogger.tistory.com/12 — crontab 사용법 리눅스 예약작업 반복작업
- 외부 1차 출처: man7.org/linux/man-pages/man5/crontab.5.html — Linux crontab(5) man page. crontab/cron 정의 구분, 시간 필드 범위(분 0~59, 시 0~23, 일 1~31, 월 1~12, 요일 0~7), 요일 0과 7 동일(일요일) 확인.
관련 글