iBetter Books
수정

crontab 설정과 관리

매일 새벽 3시에 백업을 실행하고 싶습니다. 매주 월요일 아침 9시에 주간 리포트를 생성하고 싶습니다. 5분마다 서버 상태를 확인하고 싶습니다. 이 모든 걸 사람이 직접 한다면 잠도 못 잡니다.

cron은 이런 반복 작업을 대신해주는 데몬입니다. 시스템이 켜져 있는 한 쉬지 않고 돌면서, 지정된 시간에 지정된 명령을 실행합니다.

cron 데몬과 crontab

cron 데몬(crond)은 백그라운드에서 항상 실행 중입니다. 1분마다 깨어나서 실행할 작업이 있는지 확인하고, 있으면 실행합니다.

작업 목록은 crontab(cron table)이라는 설정 파일에 저장됩니다. 사용자마다 자신의 crontab을 가질 수 있고, 시스템 전체에 영향을 미치는 시스템 crontab도 따로 있습니다.

# cron 데몬 상태 확인 (Ubuntu 24.04)systemctl status cron

참고로 CentOS/RHEL 계열에서는 서비스 이름이 crond입니다. 이 교재는 Ubuntu 24.04 환경을 기준으로 하므로 cron을 사용합니다.

crontab 편집

crontab을 다루는 명령어는 세 가지입니다.

crontab -e    # 현재 사용자의 crontab 편집 (에디터 열림)crontab -l    # 현재 사용자의 crontab 목록 확인crontab -r    # 현재 사용자의 crontab 삭제 (주의!)

crontab -e를 처음 실행하면 에디터를 선택하라고 합니다. nano를 고르면 편합니다.

시간 형식

crontab의 각 줄은 다음 형식입니다.

분  시  일  월  요일  명령어
│   │   │   │   │
│   │   │   │   └── 0-7 (0과 7 모두 일요일, 1=월, 2=화 ... 6=토)
│   │   │   └────── 1-12 (월)
│   │   └────────── 1-31 (일)
│   └────────────── 0-23 (시)
└────────────────── 0-59 (분)

특수 기호도 사용할 수 있습니다.

기호 의미 예시
* 모든 값 * = 매분/매시/매일
, 목록 1,15 = 1일과 15일
- 범위 9-17 = 9시부터 17시
/ 간격 */5 = 5분마다

cron 표현식 예제

표현식 의미
* * * * * 매 1분마다
*/5 * * * * 매 5분마다
0 * * * * 매 시간 정각
0 3 * * * 매일 새벽 3시
0 9 * * 1 매주 월요일 오전 9시
0 0 1 * * 매월 1일 자정
0 0 1 1 * 매년 1월 1일 자정
30 6 * * 1-5 평일 오전 6시 30분
0 9,18 * * * 매일 오전 9시와 오후 6시
*/10 8-17 * * 1-5 평일 8~17시 사이 10분마다
0 2 * * 0 매주 일요일 새벽 2시
15 4 1,15 * * 매월 1일과 15일 새벽 4시 15분

특별 키워드

시간 형식 대신 키워드를 쓸 수도 있습니다.

키워드 동등한 표현 의미
@reboot - 시스템 부팅 시 1회
@yearly 0 0 1 1 * 매년 1회
@monthly 0 0 1 * * 매월 1일
@weekly 0 0 * * 0 매주 일요일
@daily 0 0 * * * 매일 자정
@hourly 0 * * * * 매시 정각
# crontab 예시@reboot /home/ubuntu/scripts/init.sh@daily /home/ubuntu/scripts/cleanup.sh

crontab 환경 주의사항

cron이 실행하는 명령은 일반 터미널과 다른 환경에서 돌아갑니다. 이 차이를 모르면 터미널에서는 잘 되는 스크립트가 cron에서는 실패합니다.

PATH 문제. cron의 PATH는 /usr/bin:/bin처럼 매우 짧습니다. 스크립트에서 python3이나 node처럼 실행한다면 절대 경로를 써야 합니다.

# 나쁜 예 (cron에서 실패할 수 있음)0 3 * * * backup.sh# 좋은 예0 3 * * * /home/ubuntu/scripts/backup.sh# 또는 crontab 상단에 PATH 지정PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin0 3 * * * backup.sh

출력 처리. cron은 기본적으로 명령의 출력을 이메일로 보냅니다. 이메일 설정이 없으면 출력이 사라집니다. 로그 파일로 리다이렉션하는 것이 좋습니다.

# 표준 출력 + 에러 모두 로그 파일에 기록0 3 * * * /home/ubuntu/scripts/backup.sh >> /var/log/backup.log 2>&1# 성공/실패 모두 기록하면서 타임스탬프도 추가0 3 * * * echo "$(date) start" >> /var/log/backup.log && /home/ubuntu/scripts/backup.sh >> /var/log/backup.log 2>&1

MAILTO 설정. 출력을 이메일로 받고 싶다면 MAILTO를 지정합니다. 빈 문자열로 설정하면 이메일 발송을 끕니다.

# crontab 상단에 추가MAILTO="[email protected]"   # 이메일 발송MAILTO=""                    # 이메일 발송 끄기

실습: 매 5분마다 시스템 상태 기록

매 5분마다 CPU, 메모리, 디스크 사용률을 로그 파일에 기록하는 스크립트를 만들고 crontab에 등록해봅시다.

#!/usr/bin/env bash# 파일: /home/ubuntu/scripts/sysstat.shset -euo pipefailLOG_FILE="/var/log/sysstat.log"TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")# CPU 사용률 (1초 측정)CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)# 메모리 사용률MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')MEM_USED=$(free -m | awk 'NR==2{print $3}')MEM_PCT=$(awk "BEGIN {printf \"%.1f\", $MEM_USED/$MEM_TOTAL*100}")# 디스크 사용률 (루트 파티션)DISK_PCT=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')echo "${TIMESTAMP} | CPU: ${CPU_USAGE}% | MEM: ${MEM_PCT}% (${MEM_USED}/${MEM_TOTAL}MB) | DISK: ${DISK_PCT}%" >> "${LOG_FILE}"

스크립트에 실행 권한을 주고 crontab에 등록합니다.

chmod +x /home/ubuntu/scripts/sysstat.sh# crontab 편집crontab -e

crontab에 다음 줄을 추가합니다.

*/5 * * * * /home/ubuntu/scripts/sysstat.sh >> /var/log/sysstat_cron.log 2>&1

5분 뒤 로그 파일을 확인합니다.

tail -f /var/log/sysstat.log

실행 결과는 이런 형태입니다.

2026-04-24 09:00:01 | CPU: 2.3% | MEM: 45.2% (1843/4096MB) | DISK: 34%
2026-04-24 09:05:01 | CPU: 1.8% | MEM: 45.5% (1864/4096MB) | DISK: 34%
2026-04-24 09:10:02 | CPU: 3.1% | MEM: 46.0% (1884/4096MB) | DISK: 34%