Crontab 명령어 설명
Cron 데몬(crond)은 Unix 계열 운영 체제에서 예약된 명령을 실행하는 백그라운드 서비스입니다. crontab(cron 테이블) 파일에서 구성을 읽으며, 각 명령의 실행 시기와 빈도를 정의합니다.
구문
crontab 명령어는 사용자별 crontab 파일을 관리합니다:
crontab [-u user] [-l | -r | -e | -i] [file]옵션
- -e
- 기본 편집기($VISUAL 또는 $EDITOR)에서 현재 사용자의 crontab을 편집합니다. 편집기 종료 후 새 crontab이 설치됩니다.
- -l
- 현재 사용자의 crontab을 표준 출력에 표시합니다.
- -r
- 현재 사용자의 crontab을 완전히 제거합니다.
- -i
- 제거 전 확인을 묻습니다(-r과 함께 사용).
- -u user
- 자신의 crontab 대신 지정된 사용자의 crontab을 조작합니다. root 권한이 필요합니다.
- file
- 주어진 파일에서 crontab을 설치합니다. 표준 입력의 경우 -를 사용합니다.
Crontab 파일 형식
crontab 파일의 각 줄은 환경 변수 할당, 주석(#으로 시작), 또는 다음 형식의 cron 작업입니다:
┌───────────── 분 (0–59)
│ ┌───────────── 시 (0–23)
│ │ ┌───────────── 일 (1–31)
│ │ │ ┌───────────── 월 (1–12 또는 JAN–DEC)
│ │ │ │ ┌───────────── 요일 (0–6 또는 SUN–SAT)
│ │ │ │ │
* * * * * 실행할 명령필드 연산자
- * (asterisk)
- 해당 필드의 모든 가능한 값에 일치합니다.
- , (comma)
- 값 목록을 지정합니다. 예: 일 필드의 1,15는 1일과 15일을 의미합니다.
- - (hyphen)
- 포함 범위를 정의합니다. 예: 시 필드의 9-17은 9시부터 17시까지의 매 시간을 의미합니다.
- / (slash)
- 단계를 정의합니다. 예: 분 필드의 */10은 10분마다를 의미합니다. 범위와 결합할 수 있습니다: 1-30/5.
특수 문자열
다섯 개의 시간 필드 대신 다음 약어 문자열 중 하나를 사용할 수 있습니다:
| String | Equivalent |
|---|---|
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily / @midnight | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | Run once at startup |
환경 변수
crontab 파일 상단에 환경 변수를 설정할 수 있습니다. 가장 일반적인 것들:
- SHELL
- 명령을 실행하는 데 사용되는 셸(기본값: /bin/sh).
- PATH
- 명령의 검색 경로. Cron의 기본 PATH는 최소한(보통 /usr/bin:/bin)이므로, 항상 절대 경로를 사용하거나 PATH를 명시적으로 설정하세요.
- MAILTO
- 명령 출력을 보낼 곳. ""로 설정하면 이메일이 비활성화됩니다. 기본적으로 출력은 crontab 소유자에게 메일로 전송됩니다.
- CRON_TZ
- crontab의 시간대를 설정합니다(모든 시스템에서 지원되지는 않음). 설정하지 않으면 cron은 시스템 시간대를 사용합니다.
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
*/5 * * * * /home/user/scripts/backup.sh시스템 crontab과 사용자 crontab
사용자 crontab(crontab -e로 편집)은 다섯 개의 시간 필드와 명령으로 구성됩니다. 시스템 crontab(/etc/crontab)과 /etc/cron.d/의 파일은 시간 필드와 명령 사이에 추가 필드가 있습니다: 명령을 실행할 사용자 이름.
시스템 crontab 예제:
# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
*/15 * * * * root /usr/local/bin/system-check.sh
0 2 * * * backup /usr/local/bin/nightly-backup.sh일반적인 함정
% (percent sign)
퍼센트 기호(%)는 crontab에서 특별한 의미를 가집니다: 줄바꿈으로 변환되며, 첫 번째 % 이후의 모든 것은 명령의 표준 입력으로 전송됩니다. 리터럴 %를 사용하려면 \%로 이스케이프하세요.
# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"
# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"PATH
Cron은 최소한의 PATH로 실행됩니다. /usr/local/bin이나 다른 디렉토리의 명령에 의존하는 스크립트는 절대 경로를 사용하거나 crontab 상단에 PATH를 설정해야 합니다.
Day-of-month + day-of-week
일(day-of-month)과 요일(day-of-week)이 모두 제한된 경우(* 아님), cron은 어느 한 필드가 일치할 때 명령을 실행합니다(OR 논리). 예를 들어, 0 0 1 * 5는 매월 1일 자정과 매주 금요일에 실행됩니다.
Timezone
Cron은 기본적으로 시스템 시간대를 사용합니다. 서버가 UTC이지만 로컬 시간대로 작업을 실행하려면 CRON_TZ(지원되는 경우)를 사용하거나 시간을 수동으로 변환하세요.
Output and logging
기본적으로 cron은 모든 출력(stdout과 stderr)을 crontab 소유자에게 메일로 보냅니다. 작업을 무음으로 하려면 출력을 리디렉션하세요: command > /dev/null 2>&1. 출력을 기록하려면 파일로 리디렉션: command >> /var/log/myjob.log 2>&1.
# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1
# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1실용 예제
*/5 * * * *— run every 5 minutes0 0 * * *— run once a day at midnight0 9 * * 1-5— run at 9 AM on weekdays0 0 1 * *— run at midnight on the 1st of every month0 0 * * 0— run at midnight every Sunday