본문으로 건너뛰기

Crontab Expression Tester

Cron 표현식을 테스트하고 다음 실행 시간을 확인하는 도구입니다. 스케줄링 작업 설정과 디버깅에 필수!

Format: minute hour day month day-of-week

📋 Quick Examples

📖 Cron Expression Reference

FieldValuesSpecial Characters
Minute0-59* , - /
Hour0-23* , - /
Day of Month1-31* , - / ?
Month1-12 or JAN-DEC* , - /
Day of Week0-7 or SUN-SAT* , - / ?

Special Characters

  • * - Any value (every minute, every hour, etc.)
  • , - List separator (1,3,5)
  • - - Range (1-5)
  • / - Step values (*/5 = every 5 units)
  • ? - No specific value (used in day fields)

Common Examples

0 0 * * *Daily at midnight
0 */2 * * *Every 2 hours
30 9 * * 1-5Weekdays at 9:30 AM
0 0 1 * *First day of every month
0 0 * * 0Every Sunday at midnight
*/15 * * * *Every 15 minutes

Cron 표현식이란?

Cron 표현식은 Unix 기반 시스템에서 작업 스케줄링을 위해 사용하는 시간 지정 형식입니다.

기본 구조:

* * * * *
│ │ │ │ │
│ │ │ │ └─ 요일 (0-7, 0과 7은 일요일)
│ │ │ └─── 월 (1-12)
│ │ └───── 일 (1-31)
│ └─────── 시 (0-23)
└───────── 분 (0-59)

주요 기능

1. 실시간 파싱

  • Cron 표현식 입력 시 즉시 검증
  • 문법 오류 실시간 감지
  • 사람이 읽을 수 있는 형태로 변환

2. 다음 실행 시간 계산

  • 향후 10회 실행 시간 표시
  • 상대 시간 표시 (예: "in 5 minutes")
  • 정확한 날짜/시간 포맷

3. 빠른 예제

  • 자주 사용하는 패턴 원클릭 로드
  • 매분, 매시간, 매일, 매주, 매월 등
  • 평일/주말 예제

실제 사용 예시

1. 백업 스케줄

매일 자정 백업:

0 0 * * *
→ "At 00:00 every day"

다음 실행:
- 2024-01-16 00:00:00 (in 5 hours)
- 2024-01-17 00:00:00 (in 1 day)
- 2024-01-18 00:00:00 (in 2 days)

매주 일요일 오전 2시:

0 2 * * 0
→ "At 02:00 on Sunday"

매월 1일 오전 3시:

0 3 1 * *
→ "At 03:00 on day-of-month 1"

2. 모니터링 작업

5분마다 헬스체크:

*/5 * * * *
→ "Every 5 minutes"

다음 실행:
- 2024-01-15 18:05:00 (in 2 minutes)
- 2024-01-15 18:10:00 (in 7 minutes)
- 2024-01-15 18:15:00 (in 12 minutes)

15분마다 로그 수집:

*/15 * * * *
→ "Every 15 minutes"

매시간 정각:

0 * * * *
→ "Every hour at minute 0"

3. 리포트 생성

평일 오전 9시 일일 리포트:

0 9 * * 1-5
→ "At 09:00 on every day-of-week from Monday through Friday"

매주 금요일 오후 5시 주간 리포트:

0 17 * * 5
→ "At 17:00 on Friday"

매월 마지막 날 월간 리포트:

0 23 28-31 * *
→ "At 23:00 on every day-of-month from 28 through 31"
# 주의: 정확한 "마지막 날"은 별도 로직 필요

4. 데이터 동기화

2시간마다:

0 */2 * * *
→ "Every 2 hours at minute 0"

매일 오전 6시, 오후 6시:

0 6,18 * * *
→ "At 06:00 and 18:00"

평일 매 2시간:

0 9-17/2 * * 1-5
→ "Every 2 hours from 9 through 17 on every day-of-week from Monday through Friday"
# 9시, 11시, 13시, 15시, 17시

Cron 표현식 문법

특수 문자

1. 애스터리스크 (*)

* * * * *
→ "Every minute"

모든 값을 의미
분 필드의 *: 매분
시 필드의 *: 매시간

2. 쉼표 (,)

0 9,12,18 * * *
→ "At 09:00, 12:00, and 18:00"

여러 값을 나열

3. 하이픈 (-)

0 9-17 * * *
→ "Every hour from 9 through 17"

범위 지정
9시부터 17시까지 (9,10,11,12,13,14,15,16,17)

4. 슬래시 (/)

*/10 * * * *
→ "Every 10 minutes"

간격 지정
/10: 10 단위마다
5-45/10 * * * *
→ "Every 10 minutes from 5 through 45"
# 5분, 15분, 25분, 35분, 45분

5. 물음표 (?)

일과 요일 필드에서 사용 (상호 배타적)
하나를 지정하면 다른 하나는 ?로 표시
주로 Quartz 스케줄러에서 사용

필드별 값 범위

필드값 범위특수 값
0-59* , - /
0-23* , - /
1-31* , - / ?
1-12 또는 JAN-DEC* , - /
요일0-7 또는 SUN-SAT* , - / ?

요일 참고:

  • 0 = 일요일
  • 1 = 월요일
  • 2 = 화요일
  • 3 = 수요일
  • 4 = 목요일
  • 5 = 금요일
  • 6 = 토요일
  • 7 = 일요일 (0과 동일)

실무 예제

서버 관리

매일 로그 로테이션:

0 0 * * *
/usr/sbin/logrotate /etc/logrotate.conf

주간 시스템 업데이트 (일요일 새벽 3시):

0 3 * * 0
apt-get update && apt-get upgrade -y

디스크 정리 (매일 오전 2시):

0 2 * * *
find /tmp -type f -mtime +7 -delete

웹 애플리케이션

세션 정리 (10분마다):

*/10 * * * *
node /app/scripts/cleanup-sessions.js

캐시 무효화 (매시간):

0 * * * *
curl -X POST https://api.example.com/cache/invalidate

이메일 큐 처리 (5분마다):

*/5 * * * *
php /var/www/artisan queue:work --stop-when-empty

데이터베이스

일일 백업 (새벽 2시):

0 2 * * *
mysqldump -u root -p$PASSWORD mydb > /backup/mydb_$(date +\%Y\%m\%d).sql

주간 풀 백업 (일요일 새벽 1시):

0 1 * * 0
pg_dump mydb | gzip > /backup/full_$(date +\%Y\%m\%d).sql.gz

인덱스 재구성 (매월 1일 새벽 4시):

0 4 1 * *
psql -c "REINDEX DATABASE mydb;"

모니터링

1분마다 서버 상태 체크:

* * * * *
/usr/local/bin/health-check.sh

5분마다 CPU 사용률 로깅:

*/5 * * * *
top -b -n 1 | grep "Cpu(s)" >> /var/log/cpu-usage.log

매시간 디스크 사용량 알림:

0 * * * *
df -h | grep -E '9[0-9]%|100%' && mail -s "Disk Alert" admin@example.com

다양한 시스템별 Cron

Linux Crontab

# crontab 편집
crontab -e

# crontab 보기
crontab -l

# crontab 삭제
crontab -r

# 특정 사용자의 crontab
sudo crontab -u username -e

시스템 crontab:

# /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 분 시 일 월 요일 사용자 명령
0 2 * * * root /scripts/backup.sh

Node.js (node-cron)

const cron = require('node-cron');

// 매분 실행
cron.schedule('* * * * *', () => {
console.log('Running every minute');
});

// 평일 오전 9시
cron.schedule('0 9 * * 1-5', () => {
console.log('Weekday morning task');
}, {
timezone: "Asia/Seoul"
});

Python (APScheduler)

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger

scheduler = BlockingScheduler()

# 매일 오전 10시
@scheduler.scheduled_job(CronTrigger.from_crontab('0 10 * * *'))
def daily_task():
print("Daily task at 10 AM")

scheduler.start()

Spring Boot (@Scheduled)

@Component
public class ScheduledTasks {

// 5초마다
@Scheduled(cron = "*/5 * * * * *")
public void everyFiveSeconds() {
System.out.println("Task running every 5 seconds");
}

// 평일 오전 9시
@Scheduled(cron = "0 0 9 * * MON-FRI")
public void weekdayMorning() {
System.out.println("Weekday morning task");
}
}

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
name: backup-job
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup:latest
command: ["/scripts/backup.sh"]
restartPolicy: OnFailure

사용 팁

1. 시간대 주의

# 시스템 시간대 확인
date
timedatectl

# cron은 시스템 시간대 사용
# UTC 서버에서 KST 시간으로 실행하려면:
# KST 9시 = UTC 0시
0 0 * * * # UTC 기준

2. 로깅 설정

# 표준 출력/에러를 파일로 리다이렉트
*/5 * * * * /script.sh >> /var/log/cron.log 2>&1

# 에러만 로깅
*/5 * * * * /script.sh 2>> /var/log/cron-error.log

# 출력 무시
*/5 * * * * /script.sh > /dev/null 2>&1

3. 환경 변수 설정

# crontab 내에서 환경 변수 설정
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com

0 2 * * * /scripts/backup.sh

4. 동시 실행 방지

# flock을 사용한 락 파일
*/5 * * * * flock -n /tmp/my-cron.lock /scripts/my-script.sh

# 또는 PID 파일 체크
*/5 * * * * /scripts/run-once.sh
#!/bin/bash
# run-once.sh
PIDFILE=/var/run/my-script.pid

if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
if kill -0 $PID 2>/dev/null; then
echo "Script already running"
exit 1
fi
fi

echo $$ > $PIDFILE
trap "rm -f $PIDFILE" EXIT

# 실제 작업 실행
/scripts/my-script.sh

주의사항

1. PATH 문제

# ❌ 명령어를 찾지 못함
*/5 * * * * node script.js

# ✅ 전체 경로 사용
*/5 * * * * /usr/bin/node /home/user/script.js

# ✅ PATH 설정
PATH=/usr/local/bin:/usr/bin:/bin
*/5 * * * * node /home/user/script.js

2. 퍼센트 기호 이스케이프

# ❌ 에러 발생
0 2 * * * backup-$(date +%Y%m%d).sh

# ✅ 퍼센트를 백슬래시로 이스케이프
0 2 * * * backup-$(date +\%Y\%m\%d).sh

3. 상대 경로 사용 금지

# ❌ 작업 디렉토리가 불명확
*/5 * * * * cd mydir && ./script.sh

# ✅ 절대 경로 사용
*/5 * * * * cd /home/user/mydir && ./script.sh

4. 너무 빈번한 실행

# ⚠️ 시스템 부하 주의
* * * * * heavy-task.sh # 매분 실행

# ✅ 적절한 간격 설정
*/5 * * * * heavy-task.sh # 5분마다

트러블슈팅

Cron이 실행되지 않을 때

  1. Cron 서비스 확인:

    # systemd
    sudo systemctl status cron
    sudo systemctl start cron

    # SysV
    sudo service cron status
    sudo service cron start
  2. 로그 확인:

    # Debian/Ubuntu
    grep CRON /var/log/syslog

    # CentOS/RHEL
    grep CRON /var/log/cron

    # macOS
    log show --predicate 'process == "cron"' --last 1h
  3. 사용자 권한 확인:

    # 현재 사용자의 crontab
    crontab -l

    # root 권한이 필요한 작업은
    sudo crontab -e
  4. 명령어 테스트:

    # cron 환경에서 테스트
    env -i /bin/bash --noprofile --norc
    # crontab에 있는 명령어 실행해보기

표현식 검증

# 온라인 도구 사용
# crontab.guru
# crontab-generator.org

# 또는 이 Crontab Tester 도구 사용!

관련 도구

추가 리소스

베스트 프랙티스

1. 명확한 주석

# 매일 새벽 2시 데이터베이스 백업
0 2 * * * /scripts/db-backup.sh

# 평일 오전 9시 리포트 생성
0 9 * * 1-5 /scripts/generate-report.sh

2. 에러 알림

# 실패 시 이메일 발송
MAILTO=admin@example.com
0 2 * * * /scripts/critical-backup.sh || echo "Backup failed!"

3. 타임아웃 설정

# 최대 1시간 실행
0 2 * * * timeout 1h /scripts/long-running-task.sh

4. 모니터링

# HealthChecks.io 같은 서비스 활용
*/5 * * * * /scripts/task.sh && curl https://hc-ping.com/your-uuid