infra

Linux cron job 설정 완벽 가이드 — crontab으로 자동 실행 스케줄 등록하는 방법

Linux 서버에서 스크립트를 정해진 시각에 자동으로 실행하려면 cron을 써야 한다. crontab 문법, 표현식 작성법, 환경변수 문제, 로그 확인까지 실제 운영에서 필요한 내용을 정리했다.

Linuxcroncrontab자동화infra
crontab -e 명령으로 cron job을 등록하는 터미널 화면 — 매일 새벽 2시 스크립트 실행 표현식 예시
  • ·cron 표현식 필드 순서: 분 시 일 월 요일 (Jenkins와 동일)
  • ·crontab -e: 현재 사용자의 cron 작업 편집, crontab -l: 목록 확인
  • ·cron 환경: PATH가 제한되어 있어 스크립트 안에서 절대 경로 사용 권장
  • ·/var/log/syslog 또는 /var/log/cron: cron 실행 기록 확인 경로
서버에서 로그 파일을 매일 자정에 압축하고 30일이 지난 파일을 삭제하는 작업을 cron으로 자동화했다. 처음에 스크립트를 터미널에서 직접 실행하면 잘 되는데 cron에서 실행하면 실패하는 문제를 겪었다. 원인을 찾아보니 cron의 PATH가 /usr/bin 정도로 제한적이라 스크립트 안에서 쓰는 명령어들의 전체 경로를 지정해야 했다. 그 이후로 cron에 등록하는 스크립트에는 PATH를 직접 설정하거나 명령어 절대 경로를 쓰는 습관을 들이게 됐다.

Linux cron이란 무엇인가

Linux cron이 서버 자동화에 쓰이는 이유

cron은 Linux와 Unix 계열 시스템에서 특정 시각이나 주기에 맞춰 명령어나 스크립트를 자동으로 실행하는 데몬이다. 시스템이 시작되면 crond 프로세스가 백그라운드에서 항상 실행되면서 등록된 작업 목록을 확인하고 실행 시각이 되면 해당 명령을 실행한다. 서버 운영에서 반복적으로 해야 하는 작업들이 cron의 주요 사용처다. 매일 새벽에 DB 백업 스크립트를 실행하거나, 오래된 로그 파일을 주기적으로 정리하거나, 매시간 외부 API에서 데이터를 받아오는 작업들이 cron으로 자동화하면 사람이 직접 할 필요 없이 정해진 시각에 알아서 돌아간다. Jenkins의 cron 트리거도 내부적으로 같은 cron 문법을 사용한다. 차이는 Jenkins는 빌드 파이프라인을 실행하고 Linux cron은 셸 명령과 스크립트를 직접 실행한다는 점이다. Jenkins 없이 간단한 반복 작업만 자동화하려면 cron만으로 충분하고, 설정도 간단하다. cron은 시스템에 기본으로 포함되어 있어서 별도 설치 없이 바로 쓸 수 있다.

crontab 사용 방법

crontab으로 Linux cron job을 등록하는 방법

각 사용자의 cron 작업은 crontab 파일로 관리한다. crontab -e 명령을 실행하면 현재 사용자의 crontab 파일이 편집기에 열린다. 처음 실행하면 편집기를 선택하는 메시지가 나오는데, nano를 선택하면 가장 쉽게 사용할 수 있다. 각 줄이 하나의 cron job이다. 형식은 분 시 일 월 요일 명령어 순서다. crontab -l로 현재 등록된 작업 목록을 확인할 수 있다. crontab -r은 현재 사용자의 crontab을 전부 삭제하니 주의해야 한다. 시스템 전체 cron 작업은 /etc/crontab 파일이나 /etc/cron.d/ 디렉토리에 파일을 만들어 등록한다. 이 방식은 사용자 이름 필드가 추가되어 어떤 사용자 권한으로 실행할지 지정할 수 있다. root 권한이 필요한 작업은 sudo crontab -e로 root의 crontab에 등록하거나 /etc/crontab을 수정한다. crontab 파일을 저장하고 닫으면 crond가 자동으로 변경 사항을 인식한다. 별도로 crond를 재시작할 필요가 없다.

# crontab -e 로 편집 후 작성

# 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /home/user/scripts/backup.sh

# 매시간 30분에 실행
30 * * * * /usr/bin/python3 /home/user/scripts/fetch_data.py

# 매주 월요일 오전 9시에 실행
0 9 * * 1 /home/user/scripts/weekly_report.sh

# 5분마다 실행
*/5 * * * * /home/user/scripts/health_check.sh

# 로그 출력 추가
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1

Linux cron 표현식 작성법과 자주 쓰는 패턴

cron 표현식은 다섯 개 필드로 이루어진다. 순서는 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-7)이다. 0과 7이 모두 일요일이다. 각 필드에 *를 쓰면 해당 필드의 모든 값을 의미한다. * * * * *는 매 분마다 실행이다. 쉼표로 여러 값을 나열할 수 있다. 0 9,18 * * *는 매일 오전 9시와 오후 6시에 실행한다. 하이픈으로 범위를 지정한다. 0 9 * * 1-5는 평일 오전 9시에 실행한다. 슬래시로 간격을 지정한다. */10 * * * *는 10분마다 실행이다. 자주 쓰는 패턴으로는 @reboot가 있는데, 서버 재부팅 시 한 번 실행한다. @daily는 매일 자정, @weekly는 매주 일요일 자정, @monthly는 매월 1일 자정에 실행하는 단축 표현이다. cron 표현식이 의도대로 작성됐는지 확인하고 싶을 때는 crontab.guru 웹사이트에서 입력하면 다음 실행 시각을 바로 확인할 수 있다. Jenkins cron 트리거와 문법이 같아서 둘 중 하나를 익히면 나머지도 쉽게 쓸 수 있다.

Linux cron 환경변수 문제와 디버깅

Linux cron 환경에서 발생하는 PATH 문제를 해결하는 방법

cron에서 스크립트를 실행할 때 가장 흔하게 겪는 문제가 환경변수 차이다. 터미널에서 직접 실행하면 잘 되는 스크립트가 cron에서는 실패하는 경우가 있다. 원인은 cron의 환경이 대화형 셸 환경과 다르기 때문이다. cron 실행 환경의 PATH는 /usr/bin:/bin처럼 매우 제한적이다. 사용자가 bashrc나 bash_profile에 추가한 경로가 없어서 해당 경로의 명령어를 찾지 못한다. 해결 방법은 여러 가지다. crontab 파일 상단에 PATH=/usr/local/bin:/usr/bin:/bin처럼 PATH를 직접 정의하는 방법이 가장 확실하다. 스크립트 안에서 명령어를 절대 경로로 쓰는 방법도 있다. which 명령으로 명령어의 절대 경로를 확인하고, /usr/bin/python3 같은 전체 경로를 스크립트에 쓴다. nvm으로 관리하는 Node.js를 cron에서 쓸 때는 nvm 경로가 PATH에 없어서 node 명령을 찾지 못하는 경우가 자주 생긴다. 이 경우 node의 절대 경로를 쓰거나, crontab에서 bash --login 또는 bash -i로 실행해 셸 프로파일을 로드하는 방법을 쓴다.

Linux cron job 실행 결과를 로그로 확인하는 방법

cron job이 의도대로 실행됐는지 확인하려면 로그를 확인해야 한다. cron 자체 실행 기록은 /var/log/syslog(Ubuntu)나 /var/log/cron(CentOS/RHEL)에 기록된다. grep CRON /var/log/syslog로 cron 관련 기록만 필터링해서 볼 수 있다. 스크립트의 출력과 오류를 파일로 저장하려면 crontab에서 리다이렉션을 추가한다. 명령어 끝에 >> /var/log/job.log 2>&1을 붙이면 표준 출력과 표준 오류 모두 log 파일에 기록된다. 2>&1을 빠뜨리면 오류 메시지가 파일에 기록되지 않아서 문제가 생겨도 원인을 찾기 어렵다. cron이 실행한 명령에서 오류가 발생하면 기본적으로 시스템의 메일함으로 결과가 전송된다. 메일 설정이 없는 서버에서는 이 메일이 쌓여서 /var/mail/사용자 파일이 커질 수 있다. 메일 전송을 끄려면 crontab 맨 위에 MAILTO="" 를 추가하면 된다. 로그 파일이 무한정 커지지 않도록 logrotate 설정을 함께 해두는 것도 실운영에서 필요한 부분이다.

자주 묻는 질문

cron job이 실행됐는지 확인하는 방법이 있나요?+

grep CRON /var/log/syslog로 cron 실행 기록을 확인하거나, crontab 명령에 >> /var/log/job.log 2>&1을 추가해서 출력을 파일에 기록하세요. 로그 파일에 실행 시각과 결과가 쌓이면 의도대로 돌았는지 확인할 수 있습니다.

터미널에서는 잘 되는데 cron에서 실패하면 어떻게 해야 하나요?+

PATH 문제가 가장 흔한 원인입니다. crontab 파일 상단에 PATH=/usr/local/bin:/usr/bin:/bin을 추가하거나, 스크립트 안에서 명령어를 절대 경로로 쓰세요. which 명령어로 경로를 확인할 수 있습니다.

cron job을 특정 시간대(한국 시간 기준)로 설정하려면 어떻게 하나요?+

서버 시간대를 확인하세요. timedatectl 명령으로 현재 서버 시간대를 볼 수 있습니다. 서버가 UTC라면 한국 시간에서 9시간을 빼야 합니다. 또는 crontab 파일 상단에 TZ=Asia/Seoul을 추가하면 해당 crontab의 시간 기준이 한국 시간으로 바뀝니다.

매분 실행되는 cron job이 이전 실행이 끝나지 않았을 때 겹쳐 실행되면 어떻게 하나요?+

flock 명령으로 잠금 파일을 사용하면 이전 실행이 완료되지 않은 상태에서 새 실행을 방지할 수 있습니다. * * * * * flock -n /tmp/job.lock /home/user/scripts/job.sh 형태로 쓰면 잠금을 획득한 프로세스만 실행됩니다.

관련 글