SameOS ~/tools/cron-scheduling.md

cron 주기 설정 실수 줄이기

cron(정해진 시각에 작업을 자동으로 실행해 주는 리눅스 기능)의 실행 주기는 분, 시, 일, 월, 요일 다섯 필드(칸)로 된 crontab 표현식으로 적습니다. 짧지만 헷갈리기 쉬운 문법이라, 의도와 다른 주기로 몇 달씩 돌아가는 작업이 흔합니다. 자주 만나는 실수를 기준으로 정리했습니다.

자주 틀리는 패턴

가장 흔한 실수는 "매시 정각"을 의도하고 * * * * *를 쓰는 것입니다. 이 표현식은 매분 실행됩니다. 매시 정각은 0 * * * *입니다. 두 번째는 */30이 "30분마다"이지 "30분 뒤 한 번"이 아니라는 점, 세 번째는 요일 필드에서 0과 7이 모두 일요일이라는 점입니다.

일 필드와 요일 필드를 동시에 제한하면 두 조건은 AND가 아니라 OR로 동작합니다. 예를 들어 0 3 1 * 1은 "매월 1일이면서 월요일인 날"이 아니라 "매월 1일 또는 매주 월요일" 새벽 3시에 실행됩니다. 이 동작은 표준 cron의 오래된 규칙이라 도구로 미리 확인하는 편이 안전합니다.

작은 서버에서의 안전한 기준

백업, 썸네일 정리, 로그 압축처럼 무거운 작업은 트래픽이 적은 시간대에 서로 겹치지 않게 배치합니다. 같은 시각(예: 0 0 * * *)에 여러 작업을 몰아두면 디스크와 CPU가 동시에 튀므로, 분 단위를 3, 17, 42처럼 흩어 두는 것만으로도 부하가 완만해집니다. 실행 시간이 주기보다 길어질 수 있는 작업에는 flock 같은 중복 실행 방지를 함께 둡니다.

전용 도구 페이지의 crontab 표현식 해석기에 표현식을 입력하면 각 필드의 의미와 다음 실행 시각 3개를 브라우저 시간대 기준으로 보여줍니다. 배포 전에 의도한 시각과 맞는지 확인하는 용도로 쓸 수 있습니다.

겹침 방지: flock을 붙인 crontab

수집기처럼 오래 걸리는 작업은 이전 실행이 안 끝났는데 다음이 시작되면 데이터가 꼬입니다. flock 한 줄이면 막습니다.

# 1) crontab 편집기 열기
crontab -e

# 2) 아래 한 줄을 추가 — flock 이 "겹침"을 막습니다
#    (이전 실행이 안 끝났으면 이번 회차는 그냥 건너뜀)
0 * * * * /usr/bin/flock -n /tmp/collect.lock /usr/bin/php /home/me/collector.php
#    매시 정각 실행. flock -n 의 -n 은 "기다리지 말고 건너뛰기"

# 3) 흔한 실수 — cron 은 로그인 셸과 PATH가 달라서
#    "php" 만 쓰면 못 찾을 수 있습니다. 반드시 절대경로(/usr/bin/php)로.
#    경로 확인:  which php

# 4) 실행 결과를 로그로 남기려면 (문제 생겼을 때 원인 파악용)
0 * * * * flock -n /tmp/c.lock php /home/me/collector.php >> /home/me/cron.log 2>&1
crontab 표현식 해석기 열기 자동화 코드 강의 보기