IT·개발

리눅스 crontab 한 번에 끝내기: 옵션 6개 · 시간 표현식 · 작성 예시 8개

5월 16, 2026 2 min read

백업 스크립트 실행, 오래된 로그 정리, 주기적인 데이터 수집처럼 리눅스 서버에서 반복적으로 처리해야 하는 작업이 생길 때 가장 먼저 떠올리는 도구가 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 -ecrontab 파일 작성·편집
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
crontab -e 명령으로 진입한 vim 편집 화면

편집 화면은 vim 에디터로 열립니다. 내용을 작성한 뒤 저장하고 나오려면 ESC를 한 번 누르고 :wq!를 입력한 다음 Enter를 누르면 됩니다. vim 기본 조작이 익숙하지 않다면 아래 관련 글을 함께 참고하면 도움이 됩니다.

편집 화면에 진입했다면, 핵심 문법인 시간 표현식을 이해할 차례입니다.


4. 시간 표현식 — 분 시 일 월 요일

crontab 설정 줄은 분 시 일 월 요일 명령어 순으로 작성합니다. 각 필드의 허용 범위는 다음과 같습니다.

요일명령어
0~590~231~311~120~7ex) 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분 간격으로 실행됩니다.
vim 편집 화면에 예약 작업 한 줄을 입력한 모습

예시를 등록한 뒤에는 실제로 작업이 실행됐는지 로그로 확인할 수 있습니다.


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은 한 번 익혀 두면 반복 작업이 생길 때마다 바로 쓸 수 있는 도구입니다. 아래 순서로 직접 등록해 보세요.

  1. crontab -e — 편집 화면에 진입합니다.
  2. 매분 실행 예시(<em> </em> <em> </em> * echo "cron test")를 한 줄 입력하고 :wq!로 저장합니다.
  3. crontab -l — 등록된 목록을 확인합니다.
  4. tail -f /var/log/cron — 실시간 로그로 작업 실행 여부를 확인합니다.

처음에는 간단한 echo 명령으로 동작을 확인한 뒤, 실제 백업·로그 정리 스크립트로 교체해 나가면 됩니다.


참고 · 출처

관련 글