리눅스 crontab 사용법 (cron 시간 설정, 예제, 로그 확인)
서버를 운영하다 보면 매일 새벽 백업, 주기적인 로그 정리, 정해진 시간의 배치 실행처럼 사람이 직접 하기 번거로운 반복 작업이 생긴다. 리눅스에서는 이런 일을 cron이 대신 해 준다. 이 글에서는 crontab 사용법 기초부터 시간 표현식 작성, 로그 확인, 자주 하는 실수까지 정리한다. 등록한 작업이 돌지 않는다면 crontab 실행 안될 때 확인할 것 글도 함께 보자.

cron과 crontab 차이
- cron: 백그라운드에서 돌면서 매분 예약 작업을 확인하고 실행하는 데몬(서비스)이다.
- crontab: cron이 실행할 작업 목록(cron table)과, 그 목록을 편집하는 명령어를 함께 부르는 말이다.
즉 crontab에 “언제, 무엇을” 적어 두면 cron이 그 시간에 맞춰 실행한다. cron 서비스는 대부분의 배포판에 기본으로 설치되어 있다.
# Ubuntu / Debian
sudo systemctl status cron
# Rocky / CentOS / RHEL
sudo systemctl status crond서비스가 꺼져 있다면 start로 켜고 enable로 부팅 시 자동 시작되게 한다. 서비스 관리 명령은 리눅스 서비스 관리(systemctl) 글에 정리해 두었다.
crontab 사용법 기본 명령어
| 명령어 | 설명 |
|---|---|
crontab -e | 내 crontab 편집(없으면 새로 만든다) |
crontab -l | 내 crontab 목록 보기 |
crontab -r | 내 crontab 전체 삭제(확인 없이 바로 지워진다) |
sudo crontab -u user -l | 다른 사용자의 crontab 보기(root 권한 필요) |
처음 crontab -e를 실행하면 Ubuntu에서는 편집기를 고르라는 메시지가 나온다. vi가 익숙하다면 vim을 고르면 되고, 나중에 select-editor 명령으로 바꿀 수 있다. vi 사용법은 리눅스 vi 편집기 사용법을 참고하자.
crontab -r 주의
-e와 -r은 키보드에서 바로 옆에 있어서 오타로 전체 작업을 날리는 사고가 종종 생긴다. 중요한 서버라면 편집 전에 목록을 파일로 백업해 두는 습관을 들이자.
crontab -l > ~/crontab_backup_$(date +%Y%m%d).txt
# 복원할 때
crontab ~/crontab_backup_20261005.txtcrontab 시간 형식 이해하기
crontab의 한 줄은 다섯 개의 시간 필드와 실행할 명령으로 이루어진다.
# 분 시 일 월 요일 명령
# | | | | |
* * * * * /path/to/command| 필드 | 범위 | 비고 |
|---|---|---|
| 분 | 0~59 | |
| 시 | 0~23 | 24시간제 |
| 일 | 1~31 | |
| 월 | 1~12 | jan~dec도 가능 |
| 요일 | 0~7 | 0과 7은 일요일, 1은 월요일 |
특수 문자
| 기호 | 뜻 | 예시 |
|---|---|---|
* | 모든 값 | * * * * * 매분 |
, | 여러 값 나열 | 0 9,18 * * * 매일 9시, 18시 |
- | 범위 | 0 9 * * 1-5 평일 9시 |
/ | 간격 | */10 * * * * 10분마다 |
crontab 사용법 예제 모음
# 매일 새벽 3시 30분 백업
30 3 * * * /home/admin/scripts/backup.sh
# 5분마다 상태 점검
*/5 * * * * /home/admin/scripts/health_check.sh
# 평일 오전 9시 리포트 발송
0 9 * * 1-5 /home/admin/scripts/report.sh
# 매월 1일 0시 로그 정리
0 0 1 * * /home/admin/scripts/clean_logs.sh
# 매주 일요일 새벽 2시 재시작
0 2 * * 0 /usr/bin/systemctl restart nginx표현식이 헷갈린다면 crontab.guru 같은 사이트에 넣어 보면 “언제 실행되는지”를 문장으로 풀어 준다. 등록하기 전에 한 번씩 확인하면 실수를 크게 줄일 수 있다.
단축 표현
| 표현 | 같은 뜻 |
|---|---|
@reboot | 부팅할 때 한 번 |
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
crontab 사용법 로그 남기기
cron은 화면이 없는 환경에서 돌기 때문에, 출력을 따로 남기지 않으면 성공했는지 실패했는지 알기 어렵다. 표준 출력과 에러를 함께 파일로 보내 두자.
30 3 * * * /home/admin/scripts/backup.sh >> /home/admin/logs/backup.log 2>&1cron 자체의 실행 기록은 시스템 로그에 남는다. 실시간으로 보려면 tail -f 사용법을 함께 쓰면 편하다.
# Ubuntu / Debian
grep CRON /var/log/syslog
journalctl -u cron --since today
# Rocky / CentOS / RHEL
sudo tail -f /var/log/croncrontab 사용법 자주 하는 실수
- PATH 문제: cron은 로그인 셸보다 훨씬 짧은 PATH로 실행된다. 터미널에서는 되던 명령이 cron에서 “command not found”가 난다면 명령과 파일을 절대 경로로 적거나, crontab 맨 위에 PATH를 지정한다.
- % 기호: crontab에서 %는 줄바꿈으로 처리된다. date +%Y%m%d처럼 쓰려면 \%로 이스케이프해야 한다.
- 실행 권한: 스크립트에 실행 권한이 없으면 돌지 않는다. chmod +x로 권한을 준다. 권한은 리눅스 파일 권한(chmod, chown)에 정리했다.
- 환경 변수: .bashrc에 넣은 변수는 cron에서 읽히지 않는다. 스크립트 안에서 직접 선언한다.
- 시간대: 서버 시간대가 UTC면 한국 시간과 9시간 차이가 난다. timedatectl로 확인한다.
# crontab 맨 위에 환경 지정
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=""
# % 이스케이프 예시
0 1 * * * tar czf /backup/www_$(date +\%Y\%m\%d).tar.gz /var/www/html사용자 crontab과 시스템 crontab
crontab -e로 만든 것은 사용자별 crontab이다. 이와 별도로 /etc/crontab과 /etc/cron.d/ 아래 파일은 시스템 crontab으로, 시간 필드와 명령 사이에 실행할 사용자 이름을 한 칸 더 적는다. 형식이 달라서 그대로 복사하면 동작하지 않으니 주의하자.
# /etc/cron.d/backup (시스템 crontab은 사용자 필드가 있다)
30 3 * * * root /root/scripts/backup.sh마무리
crontab 사용법의 핵심은 세 가지다. 시간 표현식을 정확히 쓰고, 경로는 절대 경로로 적고, 결과는 로그로 남긴다. 이 세 가지만 지켜도 cron 때문에 새벽에 깨는 일은 크게 줄어든다. 그래도 작업이 실행되지 않는다면 계정 비밀번호 만료처럼 놓치기 쉬운 원인도 있으니 crontab 실행 안될 때 글에서 점검 순서를 확인해 보자.
첫 댓글을 남겨보세요