Infra/Linux

리눅스 크론탭(Linux crontab)으로 자동화 작업

누구세연 2025. 1. 11. 20:23

리눅스 환경에서는 주기적인 작업을 자동으로 실행할 필요가 있을 때, `crontab`을 사용하여 이를 간편하게 설정할 수 있습니다.

이 글에서는 리눅스에서 `crontab`을 설정하고 사용하는 방법을 정리해 보도록 하겠습니다. 👩🏻‍💻

 

crontab 이란 ⁉️

crontab은 리눅스와 유닉스 시스템에서 특정 주기로 명령어를 실행할 수 있는 시스템 도구입니다.

예를 들어, 매일 백업을 수행하거나, 정해진 시간에 로그 파일을 관리하는 등의 작업을 자동으로 처리할 수 있습니다.

  • 주요 사용 예시
    • 매일 새벽 2시에 서버 백업
    • 매주 월요일 오전 9시에 서버 리소스 모니터링
    • 매일 밤 11시에 로그 파일을 정리

 

crontab 기본 사용법 

crontab은 5개의 필드로 구성된 설정 파일입니다. 

각각의 필드는 어떤 작업을 언제 실행할지에 대한 정보를 담고 있습니다.

crontab 파일 구조

예시) 매일 2시 30분에 백업 실행

30 2 * * * /home/user/backup.sh

 

  • 30: 분 (30분)
  • 2: 시 (2시)
  • *: 매일
  • *: 매월
  • *: 매일요일

예시) 매주 월요일 오전 9시 시스템 리포트 생성

0 9 * * 1 /usr/local/bin/system-report

 

 

  • 0: 분 (0분)
  • 9: 시 (9시)
  • *: 매일
  • *: 매월
  • 1: 월요일

crontab 명령어

 

  • crontab -e: crontab 편집 모드. 작업 추가/수정.
  • crontab -l: 현재 등록된 cron 작업 목록 확인.
  • crontab -r: 모든 cron 작업 삭제.

 

crontab의 특수 문자 사용법

1) *(별표)

모든 값을 의미합니다. 예를 들어, 분(*)이 설정되면 매분마다 명령어가 실행됩니다.

* * * * * echo "Hello, World!"  # 매분 "Hello, World!" 출력

 

 

 

2) ,(쉼표)

여러 값을 나열할 때 사용합니다.

0 8,12,18 * * * /path/to/script  # 8시, 12시, 18시에 실행

 

3) -(하이폰)

범위 설정 시 사용합니다.

0 9-17 * * * /path/to/script  # 9시부터 17시까지 매 시간마다 실행

 

4) /(슬래시)

간격을 설정할 때 사용합니다.

*/5 * * * * /path/to/script  # 5분마다 실행

 

 

실전 예시 📖

예시 1: 서버 백업 자동화

매일 새벽 2시에 자동으로 서버 백업을 수행하는 crontab 예시입니다. backup.sh 스크립트를 실행하여 데이터베이스나 파일 시스템을 백업합니다.

30 2 * * * /home/user/backup.sh

backup.sh 스크립트 내용

#!/bin/bash 
tar -czf /home/user/backup/backup-$(date +\%Y\%m\%d).tar.gz /home/user/data
  • tar 명령어를 사용하여 /home/user/data 폴더를 압축하고, 백업 파일을 날짜별로 저장합니다.

예시 2: 로그 파일 정리

매일 자정에 로그 파일을 정리하는 crontab 예시입니다. 예를 들어, /var/log 폴더에 있는 오래된 로그를 삭제합니다.

0 0 * * * find /var/log -name "*.log" -type f -mtime +30 -exec rm -f {} \;
  • find 명령어로 30일 이상 된. log 파일을 찾아 삭제합니다.

 

환경 변수 설정 ⚙️

1) PATH 변수 설정

PATH란?

  • PATH는 시스템에서 명령어를 찾는 디렉터리 경로 목록입니다.
  • cron 작업에서 실행되는 기본 PATH는 일반 사용자 환경에서 설정된 것보다 제한적입니다.
    예를 들어, /usr/bin에만 접근 가능한 경우, /usr/local/bin의 명령어는 찾을 수 없습니다.

crontab 파일에 직접 PATH 변수를 설정하여 명령어가 실행되는 경로를 명시적으로 지정할 수 있습니다.

설정 방법

  1. crontab -e 명령어로 crontab 파일을 편집합니다.
  2. 파일 맨 위에 PATH 변수를 설정합니다.
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

 

  • 위 설정은 명령어를 /usr/local/bin, /usr/bin, /bin 등에서 찾게 합니다.

Python 스크립트를 실행하는 crontab 예시

PATH=/usr/local/bin:/usr/bin:/bin

0 2 * * * python3 /home/user/script.py
  • 만약 Python이 /usr/local/bin에 설치되어 있다면, 위와 같이 PATH에 /usr/local/bin을 포함해야 cron에서 제대로 실행됩니다.

확인 방법

  • cron 로그 확인: 명령어가 실행되지 않을 경우, /var/log/syslog에서 에러 로그를 확인합니다.
grep CRON /var/log/syslog
  • 디버깅 방법: 스크립트 내에 echo $PATH를 출력하여 현재 cron 환경의 PATH를 확인합니다.

 

2) MAILTO 설정

MAILTO란?

  • MAILTO는 작업 실행 결과(표준 출력 및 오류 출력)를 특정 이메일 주소로 전송할 때 사용하는 환경 변수입니다.
  • MAILTO를 설정하면, 작업 성공 여부 및 오류 내용을 확인할 수 있어 디버깅에 유용합니다.

설정 방법

1. crontab -e 명령어로 crontab 파일을 편집합니다.

2. 파일 맨 위에 MAILTO 변수를 추가합니다.

MAILTO="admin@example.com"

3. 원하는 작업을 설정합니다.

* * * * * /path/to/script

이메일 전송 조건

작업 결과가 출력될 경우에만 이메일이 전송됩니다.

  • 표준 출력(stdout) 또는 오류 출력(stderr)이 없는 경우 이메일은 전송되지 않습니다.
  • 결과가 필요 없으면 명령어 뒤에 >/dev/null 2>&1을 추가하여 출력을 무시할 수 있습니다.

예시

매일 자정에 로그를 삭제하고 결과를 이메일로 받는 설정

MAILTO="admin@example.com"

0 0 * * * find /var/log -name "*.log" -type f -mtime +30 -exec rm -f {} \;

출력을 무시하고 이메일을 전송하지 않도록 설정

MAILTO=""

0 0 * * * find /var/log -name "*.log" -type f -mtime +30 -exec rm -f {} \; >/dev/null 2>&1

 

 

crontab 문제 해결

1) 작업이 실행되지 않는 경우

  • 경로 문제: cron은 기본적으로 제한된 환경에서 실행되므로, 명령어의 전체 경로를 사용해야 할 수 있습니다.
  • 로그 파일 확인: /var/log/syslog 또는 /var/log/cron에서 오류를 확인하세요.

2) cron 서비스가 멈춘 경우

  • cron 서비스가 중지된 경우, 이를 다시 시작해야 합니다.
sudo systemctl start cron  # Ubuntu/Debian 계열
sudo service cron start    # CentOS/RHEL 계열

 

 

crontab 사용 시 유용한 팁📍

1) 출력을 파일로 저장

cron 작업의 출력 결과를 로그 파일에 저장하여 후속 처리가 가능하게 합니다.

30 2 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
  • >>는 출력을 backup.log에 추가하고, 2>&1은 오류 메시지도 동일한 파일에 기록합니다.

2) 작업의 결과 이메일로 받기

MAILTO 변수와 함께 설정하여 작업이 완료되면 이메일로 결과를 받을 수 있습니다.

MAILTO="admin@example.com" 30 2 * * * /home/user/backup.sh

 

 

 

💡 리눅스 crontab은 반복적인 작업을 자동화할 수 있는 강력한 도구입니다.
이를 활용하면 시스템 관리와 서버 작업을 더욱 효율적으로 처리할 수 있습니다. 다양한 예시를 통해 자신에게 맞는 crontab 설정을 할 수 있고, 이를 통해 시간을 절약하며 안정적인 시스템 운영을 할 수 있습니다.