crontab 사용법과 실행이 안 될 때 확인할 것
cron 표현식 읽는 법과 "터미널에서는 되는데 cron에서는 안 되는" 문제의 원인을 정리했습니다.
cron은 정해진 시간에 명령을 실행하는 리눅스 스케줄러입니다. crontab -e로 편집하고 crontab -l로 확인합니다.
표현식 읽는 법
다섯 칸은 순서대로 분, 시, 일, 월, 요일입니다.
# 매일 새벽 3시 30분
30 3 * * * /usr/local/bin/backup.sh
# 평일 오전 9시
0 9 * * 1-5 /usr/local/bin/report.sh
# 10분마다
*/10 * * * * /usr/local/bin/check.sh터미널에서는 되는데 cron에서는 안 될 때
가장 흔한 원인은 환경 차이입니다. cron은 로그인 셸의 환경을 읽지 않아 PATH가 매우 짧고, 작업 폴더도 다릅니다.
- 명령과 파일은 절대 경로로 씁니다.
- 스크립트 맨 위에 #!/bin/bash를 넣고 실행 권한을 줍니다.
- 필요한 환경 변수는 crontab이나 스크립트 안에 직접 적습니다.
- % 문자는 cron에서 줄바꿈으로 처리되므로 \%로 씁니다.
출력을 로그로 남기기
기본 상태에서는 오류가 어디에도 보이지 않는 경우가 많습니다. 표준 출력과 오류를 파일로 보내면 원인을 바로 찾을 수 있습니다.
30 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1실행 기록 확인
# Debian, Ubuntu
grep CRON /var/log/syslog | tail
# RHEL, Rocky
sudo tail /var/log/cron일과 요일을 같이 쓸 때 주의
일과 요일을 모두 지정하면 둘 중 하나만 맞아도 실행됩니다. 0 0 13 * 5는 13일의 금요일이 아니라 매월 13일과 매주 금요일에 실행됩니다.
겹쳐서 실행되는 것 막기
작업이 다음 실행 시각까지 끝나지 않으면 같은 작업이 겹칩니다. flock을 쓰면 이전 실행이 끝나지 않았을 때 건너뜁니다.
*/5 * * * * flock -n /tmp/job.lock /usr/local/bin/job.sh