리눅스에서 crontab으로 반복 작업 자동화하기

리눅스에서 crontab으로 반복 작업 자동화하기

주기적인 데이터 처리 작업을 자동화하는 방법

크롤링 데이터 DB 업데이트 자동화 사례로 배우는 실전 활용법

안녕하세요. 이 글에서는 리눅스의 crontab을 활용하여 주기적인 데이터 처리 작업을 자동화하는 방법을 소개드립니다.

매시간마다 축적되는 크롤링 데이터를 매일 5시에 데이터베이스에 반영하고 parquet 백업을 수행하는 작업을 crontab으로 진행 했습니다.


crontab이란?

crontab은 리눅스 및 유닉스 계열 운영체제에서 정해진 시간마다 자동으로 명령어나 스크립트를 실행할 수 있도록 예약하는 기능입니다. 대표적인 활용 예시는 다음과 같습니다.

  • 주기적인 데이터 수집 및 처리
  • 로그 정리 및 백업
  • 자동 메일 발송

🖥️ 사용 가능한 운영체제

운영체제지원 여부
Ubuntu (예: 20.04, 22.04)
Debian 계열
CentOS, RHEL 계열
macOS (launchd로 대체 가능)
Windows❌ (WSL이나 작업 스케줄러로 대체 가능)

⏰ 시간 설정 형식과 예시

크론탭은 다음과 같은 5개의 필드로 시간 조건을 지정합니다.

분(0–59) 시(0–23) 일(1–31) 월(1–12) 요일(0–7, 0 또는 7은 일요일) 실행할명령어

🎯 주요 예시

설명크론탭 표현예시
특정 시간에 실행30 8 * * 1매주 월요일 오전 8시 30분
반복 실행 (매시 0, 20, 40분)0,20,40 * * * *매시간 0분, 20분, 40분
범위 + 반복 실행0,20,40 8-22 * * *매일 오전 8시~오후 10시 사이 0,20,40분
간격 실행 (30분마다)*/30 * * * *매 30분마다

📝 crontab 등록 방법

1. 크론탭 편집

crontab -e

2. 시간 및 실행할 명령어 추가

  • 매일 오전 5시에 run_daily_update.sh를 실행
0 5 * * * . /home/your_user/project/run_daily_update.sh

3. 등록된 크론탭 확인

crontab -l

📦 자동화 스크립트 작성 예시

다음은 데이터 로딩 및 백업을 수행하는 스크립트입니다.

/home/your_user/project/run_daily_update.sh

#!/bin/bash

# 환경 변수 설정
export HOME=/home/your_user
export PATH="/home/your_user/.pyenv/versions/your_env_name/bin:/usr/bin:/bin"

# 현재 시간 기준 로그 파일명 설정
NOW=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="/home/your_user/project/logs/update_${NOW}.log"

echo "===== 데이터 업데이트 시작: $(date) =====" | tee -a "$LOG_FILE"

cd /home/your_user/project
source /home/your_user/.pyenv/versions/your_env_name/bin/activate

# Python 스크립트 실행 및 로그 저장
{
    python -u load_data.py
} 2>&1 | tee -a "$LOG_FILE"

echo "===== 데이터 업데이트 완료: $(date) =====" | tee -a "$LOG_FILE"

# 30일 이상된 로그 파일 삭제
find /home/your_user/project/logs -type f -name "update_*.log" -mtime +30 -delete

📘 로깅 방법

tee를 이용한 방법

  • 로그는 tee 명령어를 사용해 표준 출력과 동시에 로그 파일로 저장됩니다.
  • 로그 파일은 /home/your_user/project/logs/update_YYYYMMDD_HHMMSS.log 형태로 저장됩니다.

crontab에서 직접 로그 설정

  • crontab 명령어 줄 안에 리디렉션(>, », 2>&1)을 활용하여 표준 출력과 에러 로그를 특정 파일로 저장
* * * * * /path/to/your/script.sh >> /path/to/logfile.log 2>&1
기호의미
»기존 로그 파일에 추가 (append)
>기존 로그 파일을 덮어쓰기 (overwrite)
2>&1표준 에러(stderr)를 표준 출력(stdout)으로 함께 리디렉션

📂 실제 로그 예시 (update_20250413_195501.log)

===== 데이터 업데이트 시작: Sun 13 Apr 2025 07:55:01 PM KST =====
추가할 데이터 수 48400
Total records in CSV: 48,400

Fetching existing records for duplicate check...
Found 7,737,608 existing records

Found 1,147 duplicate records
Unique records to insert: 47,253

Inserting unique records...

  0%|          | 0/47253 [00:00<?, ?it/s]
 21%|██        | 10000/47253 [00:02<00:09, 3751.53it/s]
 42%|████▏     | 20000/47253 [00:05<00:07, 3583.72it/s]
 63%|██████▎   | 30000/47253 [00:08<00:04, 3595.00it/s]
 85%|████████▍ | 40000/47253 [00:10<00:01, 3669.71it/s]
100%|██████████| 47253/47253 [00:12<00:00, 3706.79it/s]

Data loading completed successfully!

Backing up inserted data to parquet files...
읽어들인 마지막 파트 파일: /home/your_user/project/data/parquet/qoo10_ranking_part8.parquet, 행 수: 734,516  
중복 제거 후 행 수: 781,769  
업데이트된 파일 저장: /home/your_user/project/data/parquet/qoo10_ranking_part8.parquet (781,769 행)

Final Database Statistics:
Total Records: 7,784,861
Date Range: 2024-10-29 to 2025-04-13
Unique Categories: 11

Backing up inserted data to another folder...
데이터 백업 완료
===== 데이터 업데이트 완료: Sun 13 Apr 2025 07:55:54 PM KST =====

✨ 마무리하며

crontab을 이용하면 반복적인 수작업을 자동화하여 작업 효율을 극대화할 수 있습니다.
특히 데이터 크롤링, 백업, 정리 작업처럼 정기성이 있는 업무에 매우 적합합니다.

스크립트와 로그 체계를 함께 구성하면 에러 대응, 상태 모니터링, 데이터 무결성 관리에도 큰 도움이 됩니다.
여러분도 crontab을 활용하여 자동화의 첫 걸음을 시작해보시길 추천드립니다!