업무 기록/ETC

[Linux Crontab] - Cron과 Crontab 시간설정 표현식 활용한 이미지/파일 자동 삭제 시스템 정리

code2772 2025. 5. 12. 14:22
728x90
반응형

 

 

리눅스 cron 시스템이란?

 

cron은 리눅스/유닉스 시스템에서 특정 시간이나 간격으로 명령어나 스크립트를 자동으로 실행할 수 있게 해주는 작업 스케줄러입니다. 마치 알람시계처럼 "이 시간에 이 일을 해라"라고 컴퓨터에게 지시하는 도구입니다.

 

 

 

crontab이란?

crontab(cron table)은 cron 작업을 설정하는 설정 파일입니다. 사용자별로 crontab을 가질 수 있으며, 이 파일에 실행할 명령어와 실행 시간을 지정하면 시스템이 자동으로 해당 시간에 명령을 실행합니다.

 

이미지/파일 자동 삭제를 위한 cron 구성 방법

1. 기본 crontab 사용법

# crontab 편집
crontab -e

# 현재 crontab 목록 보기
crontab -l

 

 

2. crontab 형식

 

crontab 항목은 다음과 같은 형식을 가집니다:

* * * * * 실행할_명령어
↑ ↑ ↑ ↑ ↑
│ │ │ │ └── 요일 (0-7, 0과 7은 일요일)
│ │ │ └──── 월 (1-12)
│ │ └────── 일 (1-31)
│ └──────── 시 (0-23)
└────────── 분 (0-59

 

 

3. 이미지/파일 자동 삭제 예제

 

예제 1: 간단한 파일 삭제 - 30일 이상 된 이미지 삭제

# 매일 새벽 2시에 /var/www/images 디렉토리에서 30일 이상 된 jpg 파일 삭제
0 2 * * * find /var/www/images -name "*.jpg" -type f -mtime +30 -delete

이 명령은:

  • 0 2 * * *: 매일 새벽 2시에 실행
  • find /var/www/images: /var/www/images 디렉토리에서 검색
  • name "*.jpg": jpg 확장자 파일만 대상
  • type f: 일반 파일만 선택
  • mtime +30: 30일보다 오래된 파일만 선택
  • delete: 해당 파일 삭제

 

예제 2: 로그 파일로 기록하기

# 매주 일요일 새벽 3시에 임시 이미지 디렉토리 정리하고 로그 남기기
0 3 * * 0 find /tmp/uploads -type f -mtime +7 -delete >> /var/log/cleanup.log 2>&1

이 명령은 삭제 작업 결과를 /var/log/cleanup.log 파일에 기록합니다.

 

예제 3: 특정 패턴의 백업 파일 정리

# 매월 1일 새벽 1시에 백업 디렉토리에서 30일 이상 된 백업 파일 삭제
0 1 1 * * find /backups -name "backup_*.zip" -type f -mtime +30 -delete

 

 

4. 실제 활용 가능한 이미지 자동 삭제 스크립트

더 복잡한 조건이나 처리를 위해서는 쉘 스크립트를 작성하고, 그 스크립트를 cron으로 실행하는 것이 좋습니다.

cleanup_images.sh 스크립트:

#!/bin/bash

# 설정 변수
IMAGE_DIR="/var/www/images"
LOG_FILE="/var/log/image_cleanup.log"
RETENTION_DAYS=30
RETENTION_DAYS_ARCHIVED=90

# 로그 함수
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# 스크립트 시작 로그
log_message "이미지 정리 작업 시작"

# 1. 일반 이미지 디렉토리에서 30일 이상 된 파일 삭제
OLD_FILES_COUNT=$(find "$IMAGE_DIR/regular" -type f -mtime +$RETENTION_DAYS | wc -l)
if [ $OLD_FILES_COUNT -gt 0 ]; then
    log_message "일반 이미지 디렉토리에서 $OLD_FILES_COUNT개 파일 삭제 예정"
    find "$IMAGE_DIR/regular" -type f -mtime +$RETENTION_DAYS -delete
    log_message "일반 이미지 삭제 완료"
else
    log_message "삭제할 일반 이미지 없음"
fi

# 2. 아카이브 디렉토리에서 90일 이상 된 파일 삭제
ARCHIVED_FILES_COUNT=$(find "$IMAGE_DIR/archive" -type f -mtime +$RETENTION_DAYS_ARCHIVED | wc -l)
if [ $ARCHIVED_FILES_COUNT -gt 0 ]; then
    log_message "아카이브 디렉토리에서 $ARCHIVED_FILES_COUNT개 파일 삭제 예정"
    find "$IMAGE_DIR/archive" -type f -mtime +$RETENTION_DAYS_ARCHIVED -delete
    log_message "아카이브 이미지 삭제 완료"
else
    log_message "삭제할 아카이브 이미지 없음"
fi

# 3. 빈 디렉토리 정리
find "$IMAGE_DIR" -type d -empty -delete
log_message "빈 디렉토리 정리 완료"

# 4. 디스크 사용량 보고
DISK_USAGE=$(df -h "$IMAGE_DIR" | tail -n 1)
log_message "현재 디스크 사용량: $DISK_USAGE"

# 스크립트 종료 로그
log_message "이미지 정리 작업 완료"

 

 

crontab에 스크립트 등록:

# 실행 권한 부여
chmod +x /path/to/cleanup_images.sh

# crontab에 등록 (매일 새벽 3시 실행)
crontab -e

# 아래 내용 추가
0 3 * * * /path/to/cleanup_images.sh

 

 

고급 활용: 조건부 파일 삭제

 

1. 파일 크기 기준 삭제

# 10MB보다 큰 로그 파일만 30일 후 삭제
0 4 * * * find /var/log -type f -name "*.log" -size +10M -mtime +30 -delete

 

2. 접근 시간 기준 삭제

# 90일 동안 접근되지 않은 PDF 파일 삭제
0 4 * * * find /data/documents -type f -name "*.pdf" -atime +90 -delete

 

3. 특정 조건의 임시 파일 삭제

# 썸네일 캐시에서 7일 이상 된 파일 중 특정 접두사를 가진 파일만 삭제
0 5 * * * find /var/cache/thumbnails -type f -name "temp_*" -mtime +7 -delete

 

 

안전한 자동 삭제를 위한 팁

  1. 테스트 먼저 진행: 실제 삭제(delete) 전에 print 옵션으로 어떤 파일이 대상인지 확인
  2. # 실제 삭제 전 대상 파일 목록 확인 find /var/www/images -name "*.jpg" -type f -mtime +30 -print
  3. 백업 후 삭제: 중요한 파일의 경우, 삭제 전에 백업 진행
  4. # 삭제 전 백업 디렉토리로 이동 0 1 * * * find /important/files -mtime +60 -exec mv {} /backup/directory/ \\;
  5. 로그 남기기: 항상 어떤 작업이 수행되었는지 로그 기록
  6. # 삭제 작업 로그 기록 0 2 * * * find /var/www/images -mtime +30 -delete >> /var/log/cleanup.log 2>&1
  7. 단계적 접근: 가장 오래된 파일부터 점진적으로 삭제
  8. # 365일 이상 된 파일 매일 삭제, 180일 이상은 매주 삭제 0 3 * * * find /data/files -mtime +365 -delete 0 3 * * 0 find /data/files -mtime +180 -mtime -365 -delete

 

실제 운영 사례: 선거 이미지 관리 시스템

선거 이미지 파일을 관리하는 시스템을 예로 들어보겠습니다:

#!/bin/bash

# 설정
IMAGE_ROOT="/data/election_images"
CURRENT_DATE=$(date +%Y%m%d)
LOG_FILE="/var/log/election_image_cleanup_$CURRENT_DATE.log"
ELECTION_DATE="20240415"# 선거일: 2024년 4월 15일# 로그 시작
echo "===== 선거 이미지 정리 작업 시작: $(date) =====" > "$LOG_FILE"

# 선거일 기준 상대적 날짜 계산
days_since_election=$(( ($(date -d "$CURRENT_DATE" +%s) - $(date -d "$ELECTION_DATE" +%s)) / 86400 ))
echo "선거일 이후 경과일: $days_since_election 일" >> "$LOG_FILE"

# 선거 전 이미지 (캠페인 자료)
if [ $days_since_election -gt 30 ]; then
# 선거 30일 이후에는 캠페인 이미지 삭제
    campaign_count=$(find "$IMAGE_ROOT/campaign" -type f -name "*.jpg" -o -name "*.png" | wc -l)
    echo "캠페인 이미지 $campaign_count 개 삭제 예정" >> "$LOG_FILE"
    find "$IMAGE_ROOT/campaign" -type f \\( -name "*.jpg" -o -name "*.png" \\) -delete
    echo "캠페인 이미지 삭제 완료" >> "$LOG_FILE"
fi

# 선거 당일 이미지
if [ $days_since_election -gt 90 ]; then
# 선거 90일 이후에는 선거 당일 이미지 아카이브로 이동 (삭제 대신)
    echo "선거 당일 이미지 아카이브 이동 시작" >> "$LOG_FILE"

# 아카이브 디렉토리 생성
    mkdir -p "$IMAGE_ROOT/archive"

# 이미지 압축 후 이동
    find "$IMAGE_ROOT/election_day" -type f -name "*.jpg" -exec tar -rf "$IMAGE_ROOT/archive/election_day_images.tar" {} \\; -delete

# 압축 파일 생성 시간 기록
    echo "아카이브 파일 생성: $(date)" >> "$LOG_FILE"
    echo "아카이브 크기: $(du -h "$IMAGE_ROOT/archive/election_day_images.tar" | cut -f1)" >> "$LOG_FILE"
fi

# 결과 발표 이미지
if [ $days_since_election -gt 180 ]; then
# 선거 180일 이후에는 결과 이미지도 정리
    echo "선거 결과 이미지 정리 시작" >> "$LOG_FILE"

# 중요 결과 이미지는 보존, 나머지는 삭제
    find "$IMAGE_ROOT/results" -type f -not -name "*_final_*" -delete
    echo "결과 이미지 정리 완료" >> "$LOG_FILE"
fi

# 디스크 사용량 보고
echo "디렉토리별 사용량:" >> "$LOG_FILE"
du -sh "$IMAGE_ROOT"/* >> "$LOG_FILE"

echo "===== 선거 이미지 정리 작업 완료: $(date) =====" >> "$LOG_FILE"

# 관리자에게 결과 메일 발송 (옵션)
mail -s "선거 이미지 정리 보고서 $CURRENT_DATE" admin@example.com < "$LOG_FILE"

이 스크립트를 crontab에 등록:

 

# 매월 1일 새벽 2시에 실행
0 2 1 * * /path/to/election_image_cleanup.sh

 

 

요약: cron을 사용한 이미지/파일 자동 삭제의 장점

  1. 시스템 리소스 최적화: 불필요한 파일을 자동으로 정리하여 디스크 공간 확보
  2. 자동화된 유지보수: 수동 개입 없이 정기적인 정리 작업 수행
  3. 맞춤형 정책 적용: 다양한 조건(시간, 크기, 유형 등)에 따른 세분화된 삭제 규칙 적용
  4. 감사 추적: 삭제 작업의 로그를 남겨 시스템 관리 투명성 확보
  5. 비즈니스 로직 통합: 선거와 같은 특별 이벤트에 맞춘 파일 관리 정책 구현 가능

 

cron과 crontab은 리눅스 시스템의 강력한 자동화 도구로, 이미지와 파일 관리를 효율적이고 체계적으로 수행할 수 있게 해줍니다. 특히 서버의 디스크 공간 관리와 오래된 데이터 정리에 필수적인 도구입니다.

반응형