Linux crontab 실무 정복 — 옵션·시간식·로그 저장 + 초보자 실수 2가지

리눅스 서버를 운영하다 보면 백업, 로그 정리, 정기 데이터 수집처럼 특정 시각에 반복해서 돌려야 하는 작업이 생깁니다. 이럴 때 가장 먼저 꺼내는 도구가 crontab입니다. 2021년 1월에 정리해 둔 메모를 기반으로 이번에 다시 다듬었습니다. crontab 문법은 수십 년이 지나도 거의 변하지 않는 리눅스 기본기인 만큼, 지금도 그대로 통합니다. 옵션 6가지부터 시간 표현식 필드, 작성 예시 8가지, 로그 확인·저장·끄기 패턴, 그리고 초보자가 자주 겪는 실수 2가지까지 한 글에서 따라 하며 익힐 수 있게 정리합니다.

1. crontab이란

crontab은 등록한 시간에 자동으로 명령을 실행해주는 unix계 데몬입니다. cron 데몬이 백그라운드에서 스케줄을 감시하면서, 등록된 시각이 되면 해당 명령을 자동으로 실행합니다. 로그 로테이션이나 백업처럼 정기적으로 자동 수행하는 반복 작업에 널리 활용됩니다.

2. 옵션 6가지

crontab 명령에는 아래 6가지 옵션이 있습니다.

명령어의미
crontab -u user사용자 지정 (root가 특정 사용자의 crontab 파일을 다룰 때)
crontab -ecrontab 파일 작성·편집
crontab -l-e 로 작성·편집한 내용 표시
crontab -r파일 삭제 — 주의: 등록된 crontab 전체가 즉시 삭제됩니다. 실수 방지를 위해 아래 -i 사용 권장
crontab -i-r 과 같지만 삭제 전에 yes/no 확인
service cron restartcrontab 재시작

service cron restart는 엄밀히는 crontab 명령 옵션이 아니라 cron 데몬 재시작 명령이지만, 등록 후 반영이 안 될 때 함께 알아두면 유용해 원문 표에 묶여 있습니다.

실제로는 -e(편집), -l(등록 내용 확인) 두 가지를 가장 자주 사용하게 됩니다. 삭제할 때는 -i를 쓰면 yes/no 확인 단계가 생겨 실수를 줄일 수 있습니다.

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

crontab 한 줄은 분 시 일 월 요일 명령어 순으로 작성합니다.

분 시 일 월 요일 명령어

각 필드의 허용 범위는 다음과 같습니다.

요일명령어
0~590~231~311~120~7ex) job.sh

필드별로 간단히 정리하면 다음과 같습니다.

  • : 0~59. 0은 정각, 59는 59분을 뜻합니다.
  • : 0~23. 0이 자정(00시), 23이 밤 11시입니다.
  • : 1~31. 달의 일자입니다.
  • : 1~12. 1이 1월, 12가 12월입니다.
  • 요일: 0~7. 0과 7이 모두 일요일을 나타냅니다. 1=월요일, 2=화요일, 3=수요일, 4=목요일, 5=금요일, 6=토요일입니다.
  • 명령어: 실행할 스크립트나 명령의 경로를 입력합니다.

<em>(별표)를 특정 필드에 넣으면 해당 필드의 모든 값에 대해 실행합니다. 예를 들어 </em> <em> </em> <em> </em>이면 매분마다 실행됩니다.

4. crontab -e로 진입하고 저장하기

편집 명령어로 crontab에 진입합니다.

crontab -e

명령을 실행하면 vim 에디터가 열립니다 (시스템 기본 에디터 설정에 따라 nano 등 다른 에디터가 열릴 수 있습니다). 아래와 같이 빈 편집 화면이 나타납니다.

crontab -e 명령으로 진입한 vim 편집 화면

vim이 처음이라면 먼저 아래 글을 참고하시면 도움이 됩니다. 이미 vim에 익숙하다면 바로 예약 작업을 입력하면 됩니다.

관련 글: vim 사용법 — hiwony.tistory.com/64

예약 작업 줄을 입력한 뒤 저장하고 빠져나올 때는 ESC 키를 한 번 누른 다음 :wq!를 입력하고 Enter를 누르면 됩니다. :wq!에서 !는 강제 저장을 의미합니다. 일반적으로 :wq도 동작하지만, !를 붙여두면 파일 권한 관련 오류를 예방할 수 있습니다.

5. 작성 예시 8가지

표현식에서 자주 쓰는 특수 문자는 세 가지입니다: 쉼표(,) = 다중 값 나열 / 슬래시(/) = 간격 반복 / 하이픈(-) = 연속 범위 지정.

아래 예시에서 이 세 가지 기호가 등장합니다. 각각의 상세 설명은 코드 블록 아래에서 이어집니다. 경로 /home/usr/python/...는 예시 경로입니다. 실제 환경에 맞춰 수정하시면 됩니다.

# 매분 마다 실행
* * * * * /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

# 매시간 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

# 1일에서 3일까지 3시·4시·5시에 20분마다 실행
*/20 3,4,5 1-3 * * /home/usr/python/job.sh

표현식에서 사용하는 특수 문자 상세 설명입니다.

  • , (쉼표): 여러 값을 나열합니다. 0,20,40이면 0분·20분·40분 세 시각에 실행.
  • / (슬래시): 일정 간격으로 반복합니다. */20이면 매 20분 간격으로 실행.
  • - (하이픈): 연속 범위를 지정합니다. 0-30이면 0분부터 30분까지 매분 실행.

이렇게 세 가지 기호를 조합하면 마지막 예시처럼 <em>/20 3,4,5 1-3 </em> *(1~3일의 3시·4시·5시에 20분마다 실행) 같은 복합 조건도 한 줄로 표현할 수 있습니다.

vim 편집 화면에 예약 작업 한 줄을 입력한 모습

6. 로그 — 확인·저장·끄기

아래에 로그 관련 패턴을 용도별로 정리합니다.

# --- 로그 확인 ---

# 로그 확인 (RedHat/CentOS 계열)
cat /var/log/cron

# 실시간 로그 확인 (RedHat/CentOS 계열)
tail -f /var/log/cron
# --- 로그 저장 / 끄기 ---

# /home/usr/python/log/log.txt 파일에 저장하기 (stderr 포함)
* * * * * /home/usr/python/job.sh > /home/usr/python/log/log.txt 2>&1

# 로그 남기지 않기
* * * * * /home/usr/python/job.sh > /dev/null 2>&1

tail -f를 쓰면 파일이 갱신될 때마다 실시간으로 추가 내용이 출력됩니다.

로그를 파일에 남길 때 쓰는 2>&1은 표준 에러(stderr)를 표준 출력(stdout)으로 합쳐서 같은 파일에 기록하는 패턴입니다. 오류 메시지도 함께 저장해 나중에 확인할 수 있습니다.

로그가 필요 없을 때는 /dev/null로 리다이렉션하면 출력 자체를 버립니다.

7. 초보자가 자주 겪는 실수 2가지

실수 1: 환경 변수 누락

터미널에서는 잘 실행되던 명령이 crontab에서 실행이 안 되는 경우, 대부분 환경 변수(PATH) 차이가 원인입니다. 터미널 세션에는 /usr/local/bin이나 사용자 홈 아래 bin 경로 등이 PATH에 포함돼 있지만, crontab은 기본적으로 /usr/bin:/bin만 사용합니다. 절대 경로 없이 명령 이름만 입력하면 crontab이 해당 명령을 찾지 못해 실패합니다.

해결 방법 — 두 가지 중 하나 선택:

  1. crontab 파일 상단에 PATH 직접 지정:
PATH=/usr/local/bin:/usr/bin:/bin
  1. crontab 항목에서 명령에 절대 경로 사용:
0 5 * * * /usr/bin/python3 /home/usr/python/job.py

실수 2: 로그 리다이렉션 누락

>2>&1 없이 crontab을 등록하면 실행 결과가 로컬 메일 박스로 전송되거나 아예 사라집니다. 스크립트에서 에러가 발생해도 어디서 왜 실패했는지 확인할 방법이 없어 디버깅이 막막해집니다.

등록 초기에는 반드시 아래처럼 로그 파일 경로와 2>&1을 붙여두세요.

* * * * * /home/usr/python/job.sh >> /home/usr/python/log/log.txt 2>&1

>>(이중 꺾쇠)로 쓰면 기존 내용에 추가(append)되어 로그가 누적됩니다. >(단일 꺾쇠)는 실행마다 덮어씁니다. 이력을 남기려면 >>를 사용하세요.


마무리

crontab은 익혀 두면 서버 관리 전반에서 두고두고 쓰는 도구입니다. crontab -e로 진입해 분 시 일 월 요일 명령어 형식 한 줄만 입력하면 예약 작업이 등록됩니다. 처음에는 간단한 패턴부터 시작해, 필요에 따라 쉼표·슬래시·하이픈을 조합해 나가면 됩니다.

등록 직후에는 §7에서 정리한 두 가지 실수를 미리 짚어두세요. 환경 변수(PATH) 확인로그 리다이렉션 설정 두 가지만 챙겨도 초기 트러블슈팅 시간을 크게 줄일 수 있습니다.


참고 출처: freeblogger.tistory.com/12 — crontab 사용법 리눅스 예약작업 반복작업

관련 글: vim 사용법 정리 — hiwony.tistory.com/64

Similar Posts