⏰ Cron Expression Generator

Generate and validate cron expressions with ease

🔧 Build Cron Expression

* = every minute
* = every hour
* = every day
* = every month
* = every day, 0/7 = Sunday

📝 Cron Expression

Format: minute hour day month weekday

📚 Common Presets

ℹ️ Cron Expression Guide

⭐ Special Characters

  • * - Any value
  • , - Value list (e.g., 1,3,5)
  • - - Range (e.g., 1-5)
  • / - Step values (e.g., */5)

📅 Day of Week

  • 0 or 7 - Sunday
  • 1 - Monday
  • 2 - Tuesday
  • 3-6 - Wed-Sat

📖 Examples

  • */5 * * * * - Every 5 minutes
  • 0 9 * * 1-5 - Weekdays at 9 AM
  • 0 0 1 * * - First of month

⚙️ Use Cases

  • Schedule automated tasks
  • Configure CI/CD pipelines
  • Set up backup schedules
  • Trigger periodic jobs

📚 Cron이란?

Cron은 유닉스/리눅스 시스템에서 특정 시간에 작업을 자동으로 실행하기 위한 시간 기반 작업 스케줄러입니다. Cron 표현식은 작업 실행 시간을 정의하는 문자열 형식으로, 분, 시, 일, 월, 요일 등을 지정할 수 있습니다.

🎯 Cron의 장점

  • 자동화 - 반복 작업을 자동으로 실행하여 수동 개입을 최소화합니다
  • 정확성 - 정해진 시간에 정확하게 작업을 실행합니다
  • 효율성 - 서버 리소스를 효율적으로 사용할 수 있습니다
  • 표준화 - 대부분의 리눅스/유닉스 시스템에서 지원됩니다
  • 유연성 - 복잡한 스케줄도 표현식으로 간단히 정의할 수 있습니다

📝 Cron 표현식 형식

기본 형식 (5필드)

*
*
*
*
*

(0-59)

(0-23)

(1-31)

(1-12)
요일
(0-7)

확장 형식 (6필드 - 초 포함)

*
*
*
*
*
*

(0-59)

(0-59)

(0-23)

(1-31)

(1-12)
요일
(0-7)
참고: 요일 필드에서 0과 7은 모두 일요일을 의미합니다.
일부 시스템은 월/요일에 영문 약자(JAN, MON 등)도 지원합니다.

🔤 특수 문자

* (별표) - 모든 값

해당 필드의 모든 가능한 값을 의미합니다.

* * * * * - 매분 실행
0 * * * * - 매시간 정각(0분)에 실행
0 0 * * * - 매일 자정(00:00)에 실행

, (쉼표) - 여러 값

여러 개의 특정 값을 지정합니다.

0 0 * * 1,3,5 - 월/수/금요일 자정에 실행
0 9,12,18 * * * - 매일 9시, 12시, 18시에 실행
0 0 1,15 * * - 매월 1일과 15일 자정에 실행

- (하이픈) - 범위

값의 범위를 지정합니다.

0 9-17 * * * - 매일 9시부터 17시까지 매시간 실행
0 0 * * 1-5 - 월요일부터 금요일까지 자정에 실행
0 0 1-7 * * - 매월 1일부터 7일까지 자정에 실행

/ (슬래시) - 증분

특정 간격으로 실행합니다.

*/5 * * * * - 5분마다 실행
0 */2 * * * - 2시간마다 실행
0 0 */3 * * - 3일마다 자정에 실행

? (물음표) - 값 지정 안 함

일 또는 요일 필드에서만 사용. 한쪽만 지정할 때 다른 쪽에 사용합니다.

0 0 15 * ? - 매월 15일 자정 (요일 무관)
0 0 ? * 1 - 매주 월요일 자정 (일 무관)
⚠️ 일부 Cron 구현체만 지원 (Quartz, Spring 등)

L (Last) - 마지막

월의 마지막 날 또는 요일의 마지막 발생일을 의미합니다.

0 0 L * * - 매월 마지막 날 자정
0 0 ? * 5L - 매월 마지막 금요일 자정
⚠️ 일부 Cron 구현체만 지원 (Quartz, Spring 등)

W (Weekday) - 평일

가장 가까운 평일을 의미합니다.

0 0 15W * * - 15일에 가장 가까운 평일 자정
⚠️ 일부 Cron 구현체만 지원

# (해시) - N번째 요일

월의 N번째 특정 요일을 의미합니다.

0 0 ? * 1#2 - 매월 두 번째 월요일 자정
0 0 ? * 5#1 - 매월 첫 번째 금요일 자정
⚠️ 일부 Cron 구현체만 지원 (Quartz, Spring 등)

💡 자주 사용하는 패턴

표현식설명실행 시간
* * * * *매분매일 00:00, 00:01, 00:02 ...
*/5 * * * *5분마다매일 00:00, 00:05, 00:10 ...
0 * * * *매시간매일 00:00, 01:00, 02:00 ...
0 0 * * *매일 자정매일 00:00
0 9 * * *매일 오전 9시매일 09:00
0 9 * * 1-5평일 오전 9시월~금 09:00
0 0 * * 0매주 일요일 자정일요일 00:00
0 0 1 * *매월 1일 자정매월 1일 00:00
0 0 1 1 *매년 1월 1일 자정1월 1일 00:00
0 */6 * * *6시간마다00:00, 06:00, 12:00, 18:00
30 2 * * *매일 새벽 2시 30분매일 02:30
0 9-17 * * 1-5평일 업무시간 매시간월~금 09:00-17:00 매시간

🎯 사용 사례

1. 데이터베이스 백업

매일 새벽 시간대에 자동으로 데이터베이스를 백업합니다. 트래픽이 적은 시간을 선택하여 서비스에 영향을 최소화합니다.

0 3 * * * - 매일 새벽 3시에 백업
0 2 * * 0 - 매주 일요일 새벽 2시에 전체 백업

2. 로그 파일 정리

오래된 로그 파일을 주기적으로 삭제하여 디스크 공간을 확보합니다. 보통 매일 또는 매주 특정 시간에 실행합니다.

0 0 * * * - 매일 자정에 30일 이상 된 로그 삭제

3. 리포트 생성 및 전송

일일 매출 리포트, 주간 통계 등을 자동으로 생성하고 이메일로 전송합니다. 업무 시작 전에 리포트를 확인할 수 있도록 스케줄링합니다.

0 8 * * 1-5 - 평일 오전 8시에 일일 리포트 생성
0 9 * * 1 - 매주 월요일 오전 9시에 주간 리포트 생성

4. 시스템 모니터링

서버 상태, 디스크 사용량, CPU/메모리 사용률 등을 주기적으로 체크하고 임계값 초과 시 알림을 발송합니다.

*/5 * * * * - 5분마다 시스템 상태 체크

5. 캐시 갱신

API 응답, 계산 결과 등을 캐시하고 주기적으로 갱신하여 사용자에게 최신 데이터를 제공합니다.

*/10 * * * * - 10분마다 캐시 갱신

💻 프로그래밍 예시

Linux Crontab

# crontab 편집
crontab -e

# 예시: 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /home/user/backup.sh

# 예시: 5분마다 로그 모니터링
*/5 * * * * /usr/local/bin/check-logs.sh

# crontab 확인
crontab -l

Node.js (node-cron)

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

// 매일 자정에 실행
cron.schedule('0 0 * * *', () => {
  console.log('데일리 작업 실행 중...');
  // 작업 로직
});

// 평일 오전 9시에 실행
cron.schedule('0 9 * * 1-5', () => {
  console.log('평일 업무 시작 작업 실행 중...');
});

// 5분마다 실행
cron.schedule('*/5 * * * *', () => {
  console.log('5분 주기 작업 실행 중...');
});

Python (APScheduler)

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

scheduler = BlockingScheduler()

# 매일 오전 9시 실행
@scheduler.scheduled_job(CronTrigger.from_crontab('0 9 * * *'))
def daily_task():
    print("데일리 작업 실행 중...")

# 평일 매시간 실행
@scheduler.scheduled_job(CronTrigger.from_crontab('0 * * * 1-5'))
def hourly_weekday_task():
    print("평일 시간당 작업 실행 중...")

scheduler.start()

Spring Boot (@Scheduled)

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    // 매일 자정 실행
    @Scheduled(cron = "0 0 0 * * *")
    public void midnightTask() {
        System.out.println("자정 작업 실행 중...");
    }

    // 평일 오전 9시 실행
    @Scheduled(cron = "0 0 9 * * MON-FRI")
    public void weekdayMorningTask() {
        System.out.println("평일 아침 작업 실행 중...");
    }

    // 5분마다 실행
    @Scheduled(cron = "0 */5 * * * *")
    public void everyFiveMinutes() {
        System.out.println("5분 주기 작업 실행 중...");
    }
}

❓ 자주 묻는 질문 (FAQ)

Q1. 초(seconds) 단위 스케줄링이 필요한데, Cron으로 가능한가요?

A. 전통적인 유닉스 Cron은 분 단위가 최소입니다. 하지만 일부 구현체는 초 단위를 지원합니다:

초 단위 지원:
• Spring Boot @Scheduled - 6필드 형식 (초 포함)
• Quartz Scheduler
• node-cron (확장 기능)

초 단위 미지원:
• Linux/Unix crontab
• 대부분의 표준 Cron 구현체

초 단위가 필요하면 while 루프와 sleep을 사용하거나, 초 단위를 지원하는 스케줄러 라이브러리를 사용하세요.

Q2. 0 0 31 2 * (2월 31일)처럼 존재하지 않는 날짜를 지정하면?

A. 절대 실행되지 않습니다. 2월은 최대 29일까지만 있으므로 31일은 존재하지 않습니다. 이런 경우 작업이 스케줄링되지만 실행 조건이 영원히 만족되지 않습니다.

매월 마지막 날에 실행하려면 L 특수 문자를 지원하는 시스템에서 0 0 L * *를 사용하거나, 스크립트에서 날짜를 직접 체크하는 방법을 사용하세요.

Q3. 일(day)과 요일(day of week)을 동시에 지정하면 어떻게 되나요?

A. OR 조건으로 동작합니다 (AND가 아님!).

예시: 0 0 13 * 5 (13일 또는 금요일)
→ 매월 13일 또는 매주 금요일에 실행 (둘 다 만족하지 않아도 됨)

13일이면서 금요일에만 실행하려면 스크립트 내부에서 조건을 직접 체크해야 합니다:
0 0 * * 5 [ $(date +\%d) -eq 13 ] && /path/to/script.sh

보통은 일 또는 요일 중 하나만 지정하고, 다른 쪽은 * 또는 ?로 둡니다.

Q4. Cron 작업이 실행되지 않아요!

A. 다음 사항들을 확인하세요:

1. Cron 서비스 실행 여부:
sudo service cron status (Ubuntu/Debian)
sudo systemctl status crond (CentOS/RHEL)

2. Crontab 문법 오류:
온라인 Cron 검증 도구로 표현식을 확인하세요.

3. 스크립트 실행 권한:
chmod +x /path/to/script.sh

4. 절대 경로 사용:
Cron은 환경변수가 제한적이므로 스크립트와 명령어에 절대 경로를 사용하세요.

5. 로그 확인:
/var/log/syslog 또는 /var/log/cron에서 에러 확인

6. 출력 리다이렉트:
0 0 * * * /script.sh >> /var/log/mycron.log 2>&1

Q5. */50,5,10,15,...의 차이는?

A. 대부분 동일하지만, 미묘한 차이가 있습니다:

*/5 * * * * - 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55분에 실행
0,5,10,15,20,25,30,35,40,45,50,55 * * * * - 명시적으로 지정

*/5는 더 간결하고 가독성이 좋습니다. 하지만 3-59/5처럼 시작점을 바꿀 수 있다는 장점이 있습니다:
3-59/5 * * * * - 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58분에 실행

일반적으로는 */N 형식을 사용하는 것이 좋습니다.

Q6. 작업 실행 시간이 겹치면 어떻게 되나요?

A. 기본적으로 새 작업이 동시에 실행됩니다.

예시: 5분마다 실행되는 작업이 10분 걸린다면, 작업이 중복 실행됩니다:
• 00:00 - 작업 1 시작
• 00:05 - 작업 2 시작 (작업 1이 아직 실행 중)
• 00:10 - 작업 1 종료, 작업 3 시작

해결 방법:
1. Lock 파일 사용 - 스크립트에서 lock 파일 생성하여 중복 실행 방지
2. flock 명령어 사용 - * * * * * flock -n /tmp/cron.lock /script.sh
3. 작업 간격 조정 - 작업 실행 시간보다 긴 간격으로 스케줄링

💡 사용 팁

  • 테스트: 중요한 작업은 먼저 짧은 간격(매분)으로 테스트 후 실제 스케줄로 변경하세요.
  • 로그 기록: 작업 실행 결과를 로그 파일에 기록하여 디버깅을 쉽게 하세요.
  • 알림 설정: 중요한 작업은 실패 시 이메일이나 Slack 알림을 보내도록 설정하세요.
  • 시간대 확인: 서버의 시간대(Timezone)를 확인하고, 필요시 UTC로 설정하세요.
  • 주석 추가: crontab에 각 작업의 목적을 주석으로 기록하세요.
  • 백업: crontab 설정을 정기적으로 백업하세요 (crontab -l > crontab-backup.txt).
  • 절대 경로: 스크립트와 명령어는 항상 절대 경로를 사용하세요.
  • 환경 변수: crontab 내에서 필요한 환경 변수를 명시적으로 설정하세요.
  • 검증 도구: crontab.guru 같은 온라인 도구로 표현식을 검증하세요.

⚠️ 주의사항

  • 환경 변수: Cron은 제한된 환경에서 실행되므로 PATH 등 환경 변수가 다릅니다.
  • 타임존: 서버 시간대를 확인하세요. UTC와 로컬 시간을 혼동하지 마세요.
  • 중복 실행: 작업이 길어질 경우 다음 스케줄과 겹칠 수 있으니 lock을 사용하세요.
  • 권한: 작업에 필요한 파일 및 디렉토리 권한을 확인하세요.
  • 리소스: 너무 많은 작업을 동시에 스케줄링하면 시스템 부하가 증가합니다.
  • 출력 관리: Cron 출력이 쌓이지 않도록 >/dev/null 2>&1 또는 로그 파일로 리다이렉트하세요.
  • 여름시간(DST): 시간대가 DST를 사용하면 시간이 변경될 때 주의하세요.
  • 재부팅: @reboot를 제외한 Cron 작업은 시스템 재부팅 시 즉시 실행되지 않습니다.
  • 이메일 스팸: Cron 출력은 기본적으로 이메일로 전송되므로 불필요한 출력을 제거하세요.