Oh MyUtils

Cron 표현식 파서 및 빌더 - Crontab Guru 대안

Cron 표현식을 시각적으로 파싱, 설명, 빌드하세요. 다음 실행 시간 확인, 사람이 읽을 수 있는 설명, crontab 구문 검증.

자주 묻는 질문

Cron 표현식이란 무엇인가요?

Cron 표현식은 작업 실행 스케줄을 나타내는 5-7개 필드로 구성된 문자열입니다. 원래 Unix 계열 시스템에서 cron 작업 스케줄링에 사용되었으며, 현재는 클라우드 서비스(AWS, Azure, GCP), CI/CD 파이프라인, 애플리케이션 프레임워크에서 널리 사용됩니다. 각 필드는 작업이 실행되어야 할 시점을 지정합니다: 분, 시, 일, 월, 요일.

이 Cron 파서 도구는 어떻게 사용하나요?

입력 필드에 cron 표현식을 입력하세요 (예: 0 9 * * 1-5). 도구가 즉시 파싱하여 사람이 읽을 수 있는 설명과 다음 예정된 실행 시간을 표시합니다. 프리셋 드롭다운을 사용하면 일반적인 스케줄을 빠르게 선택할 수 있습니다. Build 탭으로 전환하면 각 필드의 값을 선택하여 시각적으로 표현식을 만들 수 있습니다.

내 Cron 표현식 데이터는 안전한가요?

네. 귀하의 cron 표현식은 100% 안전하며 브라우저를 떠나지 않습니다. 모든 파싱과 계산은 JavaScript를 사용하여 클라이언트 측에서 수행됩니다. 어떤 데이터도 서버로 전송되지 않으므로, 테스트해야 하는 어떤 스케줄링 패턴에도 안전하게 사용할 수 있습니다.

표준 cron 형식과 확장 cron 형식의 차이점은 무엇인가요?

표준 Unix cron은 5개 필드를 사용합니다: 분, 시, 일, 월, 요일. 확장 형식은 앞에 초 필드를 추가하여 총 6개 필드를 사용합니다. Quartz(Java)와 같은 일부 시스템은 연도를 포함한 7개 필드 형식을 사용합니다. 이 도구는 표준 5개 필드와 확장 6개 필드 형식을 모두 지원합니다.

왜 날짜 필드가 두 개(일, 요일)인가요?

둘 중 하나 또는 둘 다 지정할 수 있습니다. 두 필드 모두 와일드카드(*)가 아닌 값으로 지정된 경우, 둘 중 하나라도 만족하면 작업이 실행됩니다(둘 다가 아님). 예를 들어, '0 9 15 * 1'은 '매월 15일 오전 9시 또는 모든 월요일 오전 9시'를 의미합니다 — '15일이 월요일인 경우에만'이 아닙니다.

'5분마다' 실행하는 cron 표현식은 어떻게 만드나요?

*/5 * * * *를 사용하세요. /5는 '5번째 값마다'를 의미합니다. 마찬가지로 */15 * * * *는 15분마다, 0 */2 * * *는 2시간마다 0분에 실행됩니다.

Cron은 어떤 시간대를 사용하나요?

기본적으로 cron은 시스템의 로컬 시간대를 사용합니다. 클라우드 서비스에서는 시간대를 지정할 수 있는 경우가 많습니다. 이 도구는 다음 실행 시간을 브라우저의 로컬 시간대로 표시합니다.

코드 예제

// Simple cron expression parser
function parseCronExpression(expression) {
  const parts = expression.trim().split(/\s+/);
  if (parts.length !== 5) {
    throw new Error('Invalid cron expression: expected 5 fields');
  }

  const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;

  function parseField(field, min, max) {
    if (field === '*') {
      return Array.from({ length: max - min + 1 }, (_, i) => min + i);
    }
    const values = new Set();
    field.split(',').forEach(part => {
      if (part.includes('/')) {
        const [range, step] = part.split('/');
        const stepNum = parseInt(step, 10);
        let start = min, end = max;
        if (range !== '*' && range.includes('-')) {
          [start, end] = range.split('-').map(Number);
        }
        for (let i = start; i <= end; i += stepNum) values.add(i);
      } else if (part.includes('-')) {
        const [start, end] = part.split('-').map(Number);
        for (let i = start; i <= end; i++) values.add(i);
      } else {
        values.add(parseInt(part, 10));
      }
    });
    return Array.from(values).sort((a, b) => a - b);
  }

  return {
    minute: parseField(minute, 0, 59),
    hour: parseField(hour, 0, 23),
    dayOfMonth: parseField(dayOfMonth, 1, 31),
    month: parseField(month, 1, 12),
    dayOfWeek: parseField(dayOfWeek, 0, 6),
  };
}

// Example usage
const expr = '0 9 * * 1-5';
console.log('Parsed:', parseCronExpression(expr));

관련 도구