Linux crontab 스케줄 작업 설정

cron 데몬을 이용한 주기적 작업 스케줄링 템플릿입니다. 백업, 로그 정리, 헬스 체크, SSL 인증서 갱신, 모니터링 등 실무에서 자주 사용하는 패턴을 포함합니다.

Gist
# crontab 편집: crontab -e
# 시스템 전역 cron: /etc/crontab  또는  /etc/cron.d/my-job
# 현재 설정 확인: crontab -l
#
# ┌───────────── 분 (0-59)
# │ ┌─────────── 시 (0-23)
# │ │ ┌───────── 일 (1-31)
# │ │ │ ┌─────── 월 (1-12 또는 jan-dec)
# │ │ │ │ ┌───── 요일 (0-7, 0과 7은 일요일, 또는 sun-sat)
# │ │ │ │ │
# * * * * *  실행할_명령어
#
# 특수 문자:
#   *   : 모든 값 (매 분/시/일/월/요일)
#   ,   : 목록 (1,3,5 = 1, 3, 5번째)
#   -   : 범위 (1-5 = 1부터 5까지)
#   /   : 간격 (*/15 = 15마다, 0-30/10 = 0~30 중 10마다)
#   @reboot, @daily, @weekly, @monthly, @yearly : 특수 키워드

# ──────────────────────────────────────────────────
# 환경 변수 설정
# ──────────────────────────────────────────────────

# 작업 실패/출력 시 이메일 수신 주소 (빈 값으로 설정 시 이메일 미발송)
MAILTO=admin@example.com

# PATH를 명시적으로 설정 (cron은 최소 환경만 제공하므로 필수)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 셸 설정 (기본값은 /bin/sh)
SHELL=/bin/bash

# 시간대 설정 (시스템 기본값 사용 또는 명시적 지정)
TZ=Asia/Seoul

# ──────────────────────────────────────────────────
# 빠른 주기 작업
# ──────────────────────────────────────────────────

# 매 분마다 서비스 헬스 체크 (응답 없으면 자동 재시작)
* * * * *  /usr/local/bin/health-check.sh >> /var/log/health-check.log 2>&1

# 매 5분마다 디스크 사용량 모니터링 (80% 초과 시 알림)
*/5 * * * *  /usr/local/bin/disk-monitor.sh

# 매 10분마다 메모리 사용량 로그 기록
*/10 * * * *  free -m >> /var/log/memory-usage.log 2>&1

# 매 15분마다 애플리케이션 메트릭 수집
*/15 * * * *  /opt/monitoring/collect-metrics.sh > /dev/null 2>&1

# ──────────────────────────────────────────────────
# 시간 단위 작업
# ──────────────────────────────────────────────────

# 매 시간 정각에 접속 로그 집계
0 * * * *  /usr/local/bin/aggregate-access-log.sh >> /var/log/aggregation.log 2>&1

# 매 시간 30분에 임시 파일 정리 (1시간 이상 된 파일)
30 * * * *  find /tmp -maxdepth 1 -mmin +60 -type f -delete

# 2시간마다 업로드 처리 큐 확인
0 */2 * * *  /opt/app/bin/process-upload-queue.sh >> /var/log/queue.log 2>&1

# ──────────────────────────────────────────────────
# 일 단위 작업
# ──────────────────────────────────────────────────

# 매일 새벽 1시: 데이터베이스 전체 백업
0 1 * * *  /usr/local/bin/pg-full-backup.sh >> /var/log/backup/pg-backup.log 2>&1

# 매일 새벽 2시: 파일시스템 증분 백업 (rsync)
0 2 * * *  rsync -avz --delete /opt/app/uploads/ backup@192.168.1.100:/backups/uploads/ >> /var/log/backup/rsync.log 2>&1

# 매일 새벽 3시: 30일 이상 된 로그 파일 삭제
0 3 * * *  find /var/log/app -name "*.log" -mtime +30 -delete

# 매일 새벽 3시 30분: 데이터베이스 통계 업데이트 (쿼리 플래너 최적화)
30 3 * * *  psql -U postgres -c "VACUUM ANALYZE;" myapp_production >> /var/log/db-maintenance.log 2>&1

# 매일 오전 6시: 일일 리포트 생성 및 이메일 전송
0 6 * * *  /usr/local/bin/generate-daily-report.sh | mail -s "일일 운영 리포트 $(date +\%Y-\%m-\%d)" team@example.com

# 매일 자정: Let's Encrypt SSL 인증서 갱신 시도 (만료 30일 이내인 경우에만 갱신)
0 0 * * *  certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/certbot-renew.log 2>&1

# ──────────────────────────────────────────────────
# 특정 요일 작업
# ──────────────────────────────────────────────────

# 매주 월요일 오전 4시: 주간 전체 백업 (더 오래 보관)
0 4 * * 1  /usr/local/bin/weekly-full-backup.sh >> /var/log/backup/weekly.log 2>&1

# 매주 화~금 평일 오전 2시 30분: 차등 백업
30 2 * * 2-5  /usr/local/bin/incremental-backup.sh >> /var/log/backup/incremental.log 2>&1

# 매주 토요일 오전 1시: 패키지 보안 업데이트 확인 (자동 설치 안 함, 알림만)
0 1 * * 6  /usr/bin/apt-get -s upgrade 2>&1 | grep -i security | mail -s "보안 업데이트 알림" admin@example.com

# 매주 일요일 오전 3시: 오래된 세션 및 임시 데이터 정리
0 3 * * 0  /opt/app/bin/cleanup-expired-sessions.sh >> /var/log/app/cleanup.log 2>&1

# ──────────────────────────────────────────────────
# 월 단위 작업
# ──────────────────────────────────────────────────

# 매월 1일 오전 5시: 월간 데이터 아카이브 및 압축
0 5 1 * *  /usr/local/bin/monthly-archive.sh >> /var/log/backup/monthly.log 2>&1

# 매월 1일 오전 7시: 월간 비용/사용량 리포트 생성
0 7 1 * *  /opt/billing/generate-monthly-report.sh

# 매월 15일: 30일 이상 된 백업 파일 삭제 (장기 보관 제외)
0 2 15 * *  find /var/backups -name "*.tar.gz" -mtime +30 ! -name "*weekly*" -delete

# ──────────────────────────────────────────────────
# 특수 키워드 사용
# ──────────────────────────────────────────────────

# 시스템 재부팅 시 한 번 실행 (서비스 초기화, 임시 파일 생성 등)
@reboot  /usr/local/bin/startup-init.sh >> /var/log/startup.log 2>&1

# @reboot: 재부팅 시  |  @daily: 매일  |  @weekly: 매주  |  @monthly: 매월
@daily   /usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2>&1