- Published on
cron 주기 설정: crontab 필드와 실행 주기 정리
- Authors

- Name
- Indo Yoon
cron 주기 설정은 crontab의 필드 순서를 정확히 이해하고, 실행 환경과 로그 확인 절차를 함께 갖추는 일이 핵심입니다. 분, 시, 일, 월, 요일 필드에 원하는 시점을 적고, 서버의 시간대와 실행 사용자 권한을 먼저 확인하세요. 아래 내용은 공식 문서에서 확인한 범위를 기준으로 설정 방법과 점검 절차를 정리합니다.
한눈에 보기
cron 주기 설정은 crontab -e로 사용자별 작업을 편집하는 방식이 가장 기본입니다. crontab의 필드 순서는 분, 시, 일, 월, 요일이며 그 뒤에 실행할 명령이 옵니다. 시스템 전체 작업은 /etc/crontab이나 /etc/cron.d/ 아래 파일에 두며, 이 파일들은 명령 앞에 실행 사용자를 추가로 적습니다.
cron은 백그라운드에서 동작하는 스케줄러이며, 사용자별 crontab과 시스템 cron 파일을 구분해서 이해해야 합니다. 사용자 crontab은 해당 사용자의 권한으로 실행되고, 시스템 cron 파일은 지정한 사용자로 실행됩니다. 따라서 같은 명령이라도 어느 파일에 두느냐에 따라 권한과 환경이 달라질 수 있습니다.
- 사용자 작업은
crontab -e로 편집하고crontab -l로 확인합니다. - 시스템 작업은
/etc/crontab과/etc/cron.d/를 사용하며 사용자 필드를 빠뜨리지 않습니다. - cron은 로그인 셸의 환경을 그대로 물려받지 않으므로
PATH,SHELL, 작업 디렉터리를 명시합니다. - 실행 결과는 메일, 표준 출력·에러 리다이렉트, 시스템 로그로 확인합니다.
- crontab 저장은 보통 자동 반영되지만, 실행되지 않으면 cron 서비스 상태와 로그를 확인합니다.
cron 주기 설정 표
자주 쓰는 주기 표현은 아래처럼 정리할 수 있습니다. 예시는 사용자 crontab 기준이며, 시스템 cron 파일에 그대로 붙일 때는 사용자 필드를 추가해야 합니다.
| 실행 목적 | crontab 예시 | 설명 |
|---|---|---|
| 매시 정각 | 0 * * * * | 분 필드만 고정하고 나머지는 모든 값을 뜻하는 별표로 둡니다. |
| 일정 간격 | */10 * * * * | 분 필드에 슬래시를 쓰면 지정한 간격마다 실행합니다. |
| 매일 실행 | 0 4 * * * | 시 필드에 원하는 시각을 적고 일·월·요일은 전체로 둡니다. |
| 매주 실행 | 0 4 * * 1 | 요일 필드에 월요일을 뜻하는 값을 적습니다. |
| 매월 실행 | 0 4 1 * * | 일 필드에 날짜를 적고 월·요일은 전체로 둡니다. |
별표는 해당 필드의 모든 값을 뜻합니다. 쉼표는 목록, 하이픈은 범위, 슬래시는 간격을 나타냅니다. @daily, @weekly, @monthly, @reboot 같은 특수 문자열도 crontab(5) 문서에 설명되어 있지만, 팀에서 사용하는 cron 구현이 이를 지원하는지 먼저 확인하는 편이 안전합니다.
필드 사이는 공백으로 구분하고, 명령에는 스크립트 경로와 인자를 적습니다. 주기만 맞추고 실행 환경을 점검하지 않으면 작업이 등록되어 있어도 실패할 수 있습니다.
단계별 설정 방법
현재 작업과 권한 확인
먼저 crontab -l로 현재 사용자의 작업을 확인합니다. whoami와 id로 실행 사용자를 확인하고, 시스템 작업이라면 sudo 권한이 필요한지 판단하세요. 서비스 계정으로 실행해야 하는 작업은 해당 계정의 crontab을 사용하는 편이 권한 범위를 줄이는 데 도움이 됩니다.
crontab 편집과 주기 작성
crontab -e를 실행하면 편집기가 열립니다. 각 작업은 필드와 명령을 이어서 적고, 주석은 #으로 시작합니다. 예를 들어 0 4 * * * /usr/bin/bash /opt/app/scripts/backup.sh >> /var/log/app/backup.log 2>&1처럼 절대 경로와 로그 리다이렉트를 함께 적으면 실행 여부를 추적하기 쉽습니다.
편집을 마치면 저장하고 편집기를 종료합니다. crontab 문법 오류가 있으면 저장 단계에서 경고가 나오므로 메시지를 확인하세요. 등록 후에는 crontab -l로 내용이 의도한 대로 들어갔는지 다시 확인합니다.
환경 변수와 작업 디렉터리 정리
cron은 로그인 셸의 환경을 그대로 물려받지 않으므로 PATH, SHELL, 애플리케이션 환경 변수를 명시해야 합니다. crontab 상단에 PATH=/usr/local/bin:/usr/bin:/bin과 SHELL=/bin/bash를 적고, 필요하면 MAILTO로 실행 결과를 받을 주소를 지정하세요. 스크립트 안에서는 cd /opt/app처럼 작업 디렉터리를 직접 이동하고, 비밀 값은 권한을 제한한 환경 파일에서 읽도록 구성합니다.
로그와 종료 코드 확인
표준 출력과 표준 에러를 파일이나 로그 수집기로 보내면 cron이 조용히 실패하는 상황을 줄일 수 있습니다. 스크립트 마지막에 종료 코드를 로그로 남기거나, 실패 시 알림을 보내는 래퍼를 두세요. crontab -l로 등록 내용을 다시 확인하고, 로그에 실행 시각과 결과가 남는지 점검합니다.
서비스 상태와 반영 확인
crontab 저장은 보통 cron 서비스가 자동으로 감지하지만, 실행되지 않으면 서비스 상태를 확인해야 합니다. 배포판에 따라 서비스 이름이 cron 또는 crond일 수 있으므로 systemctl status cron과 systemctl status crond 중 해당하는 명령을 사용하세요. 컨테이너나 최소 이미지에서는 cron 서비스가 아예 없을 수 있으므로 기반 이미지의 구성을 먼저 확인합니다.
상황별 선택
단순한 정기 작업은 cron이 간단하고 예측하기 쉽습니다. 하지만 실행 순서, 의존성, 실패 재시도, 로그 통합이 중요해질수록 스크립트와 운영 도구를 함께 설계해야 합니다.
- 단순 백업·정리: cron에 절대 경로와 로그 리다이렉트를 함께 적습니다.
- 배포 자동화: cron으로 배포 스크립트를 호출하되
flock같은 잠금으로 중복 실행을 막고, 실패 알림과 롤백 절차를 둡니다. - 여러 서버 운영: 서버마다 손으로 crontab을 편집하기보다 구성 관리 도구로 같은 작업을 배포합니다.
- 복잡한 의존성: systemd timer나 배포 도구의 스케줄 기능을 검토합니다. systemd.timer 공식 문서에서 타이머 단위의 동작을 확인할 수 있습니다.
배포 작업은 애플리케이션 코드와 함께 스크립트를 버전 관리하고, 실행 계정과 로그 경로를 문서화하는 편이 좋습니다. cron은 스케줄만 담당하므로 배포 성공 여부와 롤백은 별도 절차로 검증해야 합니다.
주의할 점
- 시간대: cron은 서버의 시스템 시간대를 기준으로 동작합니다. 애플리케이션이 다른 시간대를 기대한다면 실행 시각이 어긋날 수 있으므로
timedatectl등으로 서버 시간대를 확인합니다. - 일 필드와 요일 필드: 많이 쓰이는 Vixie cron 계열에서는 두 필드가 모두 제한되면 둘 중 하나만 맞아도 실행됩니다. 특정 날짜와 요일을 동시에 만족해야 하는 작업은 스크립트 안에서 조건을 검사하세요.
- 퍼센트 기호: crontab에서
%는 특별한 의미를 가지므로 명령에 포함해야 할 때는 역슬래시로 이스케이프합니다. - 중복 실행: 이전 작업이 끝나기 전에 다음 작업이 시작될 수 있습니다. 잠금 파일이나 실행 시간 제한을 두어 겹침을 막습니다.
- 권한과 비밀 값: crontab에 비밀 값을 직접 적지 말고, 권한을 제한한 환경 파일이나 비밀 관리 도구를 사용합니다.
- 삭제 명령:
crontab -r은 현재 사용자의 모든 작업을 지우므로 백업 없이 사용하지 않습니다. - 로그 비대화: 리다이렉트한 로그가 커지지 않도록 logrotate 같은 도구를 함께 설정합니다.
cron 작업이 실행되는 셸과 대화형 셸의 차이를 고려해, 스크립트에서 필요한 환경을 스스로 설정하도록 만드는 것이 안전합니다. 또한 운영 서버에서 처음 적용할 때는 알림을 켜 두고 로그를 확인한 뒤 범위를 넓히는 편이 좋습니다.
자주 묻는 질문
cron이 실행되지 않을 때 무엇을 먼저 확인해야 하나요?
먼저 crontab -l로 작업이 실제로 등록되어 있는지 확인하고, systemctl status cron 또는 systemctl status crond로 서비스 상태를 봅니다. 다음으로 명령에 사용한 경로가 절대 경로인지, 실행 파일에 권한이 있는지 확인합니다. 마지막으로 배포판의 로그 위치나 journalctl -u cron에서 오류 메시지를 확인합니다.
일 필드와 요일 필드를 함께 제한하면 어떻게 동작하나요?
많이 쓰이는 Vixie cron 계열에서는 일 필드와 요일 필드가 모두 제한된 경우 둘 중 하나만 맞아도 작업이 실행됩니다. 따라서 매월 특정 날짜이면서 특정 요일인 경우만 실행하려는 의도라면 두 필드를 동시에 제한하지 말고 스크립트 안에서 날짜를 검사하는 편이 안전합니다. 구현에 따라 차이가 있을 수 있으므로 사용하는 cron 문서를 확인해야 합니다.
배포 자동화에 cron을 사용해도 괜찮나요?
가능하지만 배포 작업은 중복 실행과 실패 복구를 고려해야 하므로 단순 주기 실행보다 주의가 필요합니다. flock 같은 잠금 도구로 동시 실행을 막고, 배포 로그와 실패 알림을 남기며, 이전 버전으로 되돌리는 절차를 함께 준비하세요. 의존성과 실행 순서가 복잡하다면 systemd timer나 배포 도구의 스케줄 기능을 검토하는 편이 좋습니다.
cron에서 환경 변수가 적용되지 않는 이유는 무엇인가요?
cron은 로그인 셸의 환경을 그대로 물려받지 않고 제한된 환경에서 명령을 실행합니다. 그래서 PATH, SHELL, 애플리케이션 환경 변수를 crontab 상단이나 실행 스크립트 안에서 명시해야 합니다. 비밀 값은 crontab에 직접 적기보다 권한을 제한한 환경 파일을 읽도록 구성하세요.
출처
아래 문서는 cron 필드 문법과 실행 환경, crontab 명령 사용법을 확인한 공식 문서입니다.
- crontab(5) - Linux man-pages
- cron(8) - Linux man-pages
- crontab(1) - Linux man-pages
- systemd.timer - freedesktop.org
관련 운영 글
서버 운영과 배포 자동화를 더 살펴보려면 devbull의 Linux 명령어 모음과 배포 체크리스트를 함께 확인해 보세요. cron 주기 설정은 편집만으로 끝나지 않고, 실행 로그와 실패 알림을 주기적으로 점검할 때 안정적으로 유지됩니다.