내가 일으킨 최악의 생산 버그는 cron 표현식의 한 문자였습니다. 나는 매일 밤 자정에 데이터베이스 백업을 실행하기를 원했습니다. 나는 썼다 0 0 * * * 내 머리 속에, 타이핑 0 0 * * 0 crontab 으로,그리고 계속 나아갔습니다. 그 일은 한 번 실행되었습니다 - 다음 일요일 - 그리고 일주일 동안 다시하지 않았습니다. 존재하지 않는 백업이 필요할 때 알게되었습니다. 그 잘못된 자리 한 자리가 "every day" into "every Sunday," 그리고 구문의 어떤 것도 나에게 경고하지 않았습니다. Cron 은 당신이 말하는 것을 정확하게,말없이, 영원히.
TL;DR: X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 10 크론 발현 생성기 일반 필드 또는 원 클릭 사전 설정에서 표준 5 필드 crontab 표현식을 빌드하고 입력할 때 문장으로 설명하고 UTC에서 다음 실행 시간을 미리보기하여 프로덕션에 도달하기 전에 일정을 확인할 수 있습니다. 이는 전적으로 브라우저에서 실행됩니다. 계정도 없고 업로드도 없습니다.
나는 다시는 내 머리에서만 확인 했다 일정을 커밋 하 고 싶지 않았기 때문에 Toolz.dev에 대 한이 도구를 구축. 일반 영어로 다시 cron 표현을 읽고 그것이 발사 됩니다 실제 날짜를 보고는 잡는다 0 -대- * 즉시 실수 클래스. 이 가이드는 cron 구문이 어떻게 작동하는지,거의 모든 사람에게 트립되는 상호 작용 및 생성기를 사용하여 신뢰할 수있는 표현식을 생성하는 방법을 다룹니다.
크론 표현이란?
크론 표현식은 공백으로 구분된 다섯 개의 필드로 구성된 컴팩트한 일정입니다. 왼쪽에서 오른쪽으로 분,시, 월,월, 요일입니다. 5 필드 형식은 POSIX 에 의해 지정됩니다 crontab 항목 형식. 스케줄러 - 클래식 유닉스 cron 데몬뿐만 아니라 CI 시스템, Kubernetes CronJobs 및 수많은 작업 실행자도 표현식을 읽고 모든 필드에 맞는 매 순간 작업을 실행합니다.
각 필드는 단일 숫자 이상을 허용합니다. 별 (A star)*) 는 "every" 그 필드의 값입니다. 와 같은 리스트 1,15,30 는 몇 가지 특정 값을 의미합니다. A range like 1-5 는 포괄적인 범위를 의미합니다. A step like */15 수단 "every fifteenth" field's 최소에서 시작하는 값. 당신은 거의 모든 반복 일정을 설명하기 위해 다섯 필드에 걸쳐 이들을 결합: 매 분,매 분기 시간,평일 오전 8 시,매월 첫 번째,마지막 분기's 오프닝 일 전원은 진짜,그래서 밀도입니다 - 다섯 필드는 미묘하게 잘못 얻기 쉬운 정확히 이유입니다,놀랍도록 정확한 일정을 인코딩 할 수 있습니다.
다음은 생성기가 사용하는 필드 레이아웃이며 각각에 대한 유효한 범위는 다음과 같습니다:
| 위치 | 필드 | 범위 | 노트 |
|---|---|---|---|
| 1 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 100 X 1 | 분 | 0~59 | |
| 2 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X 2000 X | 시간 | 0~23 | 24시간 시계 |
| 3 X 1000 X 1000 X 1000 X 100 X 100 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X 30 X | 월의 날 | 1~31 | |
| 4 X 1000 X 1000 X 1000 X 400 X 400 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X 40 X | 월 | 1~12 | JAN-DEC 또한 받아들였다 |
| 5 X 1000 X 1000 X 1000 X 100 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 50 X 5 | 요일 | 0~6 | 0 과 7 은 모두 일요일을 의미한다; SUN-SAT 수락됨 |
손으로 쓰는 대신 표현식을 생성하는 이유는 무엇입니까
손으로 cron 을 작성하는 것은 필드 순서,범위 및 상호 작용을 올바르게 기억 한 내기이며 작업이 실행되거나 실패 할 때까지 피드백이 없습니다. 생성기는 그 내기를 확인으로 대체합니다. 필드를 채우면 한 번에 세 가지 작업을 수행합니다.
먼저,범위를 벗어난 값,역전된 범위 및 잘못된 형식의 단계를 문제가 되는 필드의 이름을 지정하는 메시지로 잡아 표현식을 조합하고 유효성을 검사합니다.A expression like 0 25 * * * - 25시간은 존재하지 않습니다. - 받아들여지기보다는 설명과 함께 거부되고 조용히 실행되지 않습니다.
둘째, 일정을 문장으로 렌더링합니다. 0 8 * * 1-5 된다 "월요일부터 금요일까지 08:00 에." 단어로 일정을 읽는 것은 당신이 구축 한 것이 당신이 의미 한 것이 아니라는 것을 알아 차리는 가장 빠른 방법입니다. 내 자정 - 백업 버그는 내가 읽은 순간에 분명했을 것입니다 "일요일 00:00 에"대신 "00:00 에."
셋째,실제 다가오는 실행 시간을 미리 봅니다. 오늘 밤 대신 3 개월 후에 작업이 다음에 실행 될 것이라는 것을 보는 것은 별표를 쳐다 보는 것보다 훨씬 더 본능적으로 잘못된 것을 알려줍니다. 이 미리보기는 또한 불가능한 일정을 포착합니다 - 2 월 30 일을 요청하고 발전기는 다가오는 실행이 전혀 없기 때문에 전혀 표시되지 않습니다.
Cron Expression Generator를 사용하는 방법
1단계: 사전 설정 또는 빈 슬레이트에서 시작합니다
올바른 표현식에 대한 가장 빠른 경로는 이미 가까운 표현식에서 시작하는 것입니다. "Weekdays at 8am," "Every 15 minutes," or "First of month at midnight,"와 같은 사전 설정을 선택하고 필드는 조정할 준비가로드됩니다. 아무 것도 맞지 않으면 매분 기본값에서 시작하여 아래로 편집하십시오. 대부분의 실제 일정은 12 가지 일반적인 패턴의 변형이기 때문에 사전 설정이 존재하며 알려진 좋은 표현식에서 시작하여 전체 범주의 실수를 제거합니다.
2 단계: 다섯 개의 필드를 설정합니다
각 필드에 값을 입력하거나 그대로 둡니다 * for "every." 각 필드는 단일 값,쉼표 목록,하이픈 범위 또는 슬래시 단계를 허용합니다. 예를 들어 평일 영업 시간 동안 매 시간의 상단에서 실행하려면 분을 로 설정합니다 0, 1시간 ~ 9-17, 그리고 요일 1-5월과 월의 날짜를 그대로 둡니다 *. 각 필드 아래의 힌트는 유효한 범위를 상기시켜 주므로 순서를 외울 필요가 없습니다.
3 단계: 일반-영어 설명을 읽으십시오
입력할 때 설명 업데이트를 시청하세요. 이것이 저장하는 단계입니다. 문장이 머릿속의 일정과 일치하지 않으면 표현이 잘못되었으며 일주일 후 프로덕션 대신 브라우저에서 알게 되었습니다. 시간,일 및 월 제한을 확인하여 의도한 대로 읽습니다.
4 단계: 다음 실행을 확인하고 복사합니다
UTC 로 계산된 다가오는 실행 시간을 미리 보려면 클릭하세요. 놀라운 것을 스캔하세요 - 너무 긴 간격,너무 먼 첫 실행,또는 불가능한 날짜를 알리는 빈 목록 스케줄이 제대로 보이면 표현식을 복사하여 crontab,pipeline 또는 CronJob 매니페스트에 붙여넣으세요.
월일과 요일의 함정
당신이 크론에 대해 한 가지를 기억한다면,이것을 만들,그것은 거의 모든 사람을 처음으로 놀라게하기 때문에. 언제 둘 다 월별 필드와 주별 필드는 제한되어 있습니다. 즉, 둘 다 제한되지 않습니다 * - 표준 크론은 AND가 아닌 OR과 결합합니다. 작업은 언제 실행됩니다 둘 중 하나 조건이 일치합니다.
그래서 0 0 13 * 5 는 의미하지 않는다 "midnight on Friday the 13th." 그것은 "midnight on 13th of every month,그리고 또한 midnight on every Friday." 그것들은 매우 다른 일정; 두 번째 화재는 한 달에 여러 번. 이 동작은 대부분의 스케줄러가 상속하는 원래의 Vixie cron 구현에서 바로 나오며,생성기는 정확하게 그것을 존중합니다. 그것의 다음 실행 미리보기는 의도하지 않은 OR 을 잡을 수있는 가장 명확한 가능한 방법 인 13ths 와 Fridays 를 모두 보여줄 것입니다.
실제 규칙: 이틀 필드 중 하나를 그대로 두십시오 * OR 동작을 진정으로 원하지 않는 한. "13 일의 금요일 만," cron 이 진정으로 필요하다면 하나의 표현으로 표현할 수 없습니다 - 당신은 당신의 직업에서 그 논리를 처리합니다. 미리보기에서 실제 실행 날짜를 보는 것은 숨어있는 gotcha 에서 명백하고 눈에 보이는 사실로 이것을 바꾸는 것입니다.
실제로 단계, 범위 및 목록입니다
단계 구문은 많은 스케줄링 능력이 존재하는 곳이며 많은 혼란이 시작되는 곳입니다. */5 분 필드에서 분 0, 5, 10, 15, 등등 55 - "every five minutes." 범위에 단계를 고정 할 수 있습니다: 0-30/10 0,10, 20,30 분만 의미합니다. a step,like 가 있는 맨값 5/15 분 필드에서 "5 에서 시작, 매 15" 필드 최대까지 - 5, 20, 35, 50.
목록과 범위는 자유롭게 결합됩니다. 1,4,7,10 월 필드에는 1월, 4월, 7월, 10월의 분기별 일정이 제공됩니다. 1-5 요일에는 월요일부터 금요일까지 제공됩니다. 9-17 시간 필드에서 당신에게 아홉 다섯 창을 제공합니다. 그들을 혼합, 0 9-17 * * 1-5 "at 분으로 읽습니다 9am 에서 5pm 까지 매 시간의 0,월요일에서 Friday" - 일반적인 비즈니스 시간 심장 박동. 발전기는이 모든 것을 확장하고 검증하며,설명은 예를 들어 범위가 포함되는지 여부에 대해 모호함이 없도록 구축 한 내용을 설명합니다 (그것은).
일반적인 사용 사례
예약된 백업 및 유지 관리. 정식 크론 작업입니다. 생성 0 2 * * * 야간 오전 2 시 백업의 경우 설명을 읽고 주간이 아닌 일일임을 확인하고 다음 실행을 미리보고 첫 번째 실행이 오늘 밤인지 확인하십시오. 이것은 몇 년 전에 내가 저지른 정확한 실수이며 미리보기가 방지하는 정확한 실수입니다.
CI 및 배포 일정. 야간 빌드,예약된 테스트 실행 및 주기적 배포는 모두 GitHub Actions,GitLab CI 및 유사한 시스템에서 cron 구문을 사용합니다. 여기에 표현식을 빌드하고 확인한 다음 워크플로 파일에 붙여넣습니다. 이러한 시스템은 자체 서버에서 실행되므로 아래의 시간대 주의 사항을 참고하십시오.
데이터 파이프라인 및 보고서. 매주 월요일 오전 6 시에 주간 보고서는 0 6 * * 1; 첫 번째 월별 롤업은 다음과 같습니다 0 0 1 * *; 분기별 직업은 다음과 같습니다 0 0 1 1,4,7,10 *. 이들을 생성하고 다시 읽으면 잘못된 day"에 클래식 "ran 중지 파이프 라인 사건.
캐시 온난화와 심장 박동. 고주파수 작업 등 */5 * * * * 캐시를 따뜻하게 유지하거나 건강 검진을 똑딱 거리십시오. 미리보기는 단계를 잘못된 필드에 넣었기 때문에 예를 들어 한 시간에 한 번이 아니라 예상 한 간격임을 확인합니다.
학습 크론. 여전히 직관을 구축하고 있다면 생성기는 교육 도구입니다. 표현식을 입력하고,문장을 읽고,실행을 보고,문법과 동작 간의 매핑은 문서화만으로는 결코 관리되지 않는 방식으로 구체화됩니다.
시간대에 대한 참고 사항입니다
다음 실행 미리보기는 UTC 에서 시간을 계산하므로 결과는 결정론적이며이 글을 읽는 모든 사람에게 동일합니다. 그러나 실제 cron 데몬은 달리 구성되지 않는 한 server's 로컬 시간대에서 실행되며 CI 공급자는 각각 자체 규칙을 가지고 있습니다 - 많은 기본값은 UTC 이며 일부는 그렇지 않습니다. 표현식 자체는 시간대를 전달하지 않습니다; 결정하는 것은 스케줄러입니다. 따라서이 도구에서 라이브 시스템으로 표현식을 이동할 때 system's 시간대를 확인하고 그에 따라 머릿속의 실행 시간을 오프셋하십시오. A 0 0 * * * 욥은 자정입니다 - 그러나 자정입니다 어디 전적으로 작업이 실행되는 위치에 따라 다릅니다. timezone 오프셋에 대해 추론해야 하는 경우, the 시간대 변환기 편리합니다 타임스탬프 변환기 스케줄러 로그가 Unix 타임스탬프로 실행될 때 도움이 됩니다.
표현식 생성 대 구문 분석
이 도구는 필드에서 표현식을 만듭니다. 그것의 형제,the 크론 표현식 파서,다른 방법으로 간다: 기존 표현식을 붙여넣고 그것을 설명하고 실행을 미리 본다. 둘은 같은 문제의 두 방향을 커버한다. 원하는 일정을 알고 구문이 필요할 때 생성기를 사용한다; 표현식을 상속받았고 그것이 무엇을 하는지 이해해야 할 때 파서를 사용한다. 둘 다 같은 Vixie-cron 의미론을 존중하며,월 또는 요일 규칙을 포함하므로,하나에서 읽은 설명은 다른 하나에서 볼 수 있는 동작과 일치한다. 함께 그들은 내가 설명하는 더 넓은 키트 내에서 작고 집중된 쌍입니다 웹 개발자 툴킷 개요 및 더 넓은 코딩 도구 가이드.
개인 정보 보호: 모든 것이 브라우저에서 실행됩니다
여기에는 업로드할 것이 없고,아무것도 업로드되지 않습니다. 표현식은 클라이언트 측 코드에서 완전히 빌드되고,검증되고, 설명되고,시뮬레이션됩니다. 보이는 것보다 더 중요합니다: 내부 작업 일정은 제 3 자에 앉아 있고 싶지 않은 system's 아키텍처 및 케이던스에 대한 내용을 공개할 수 있습니다's 로그. 인터넷에서 연결을 끊으면 도구가 독립적임을 확인할 수 있습니다. 계속 작동합니다. 이는 Toolz.dev 의 모든 도구 뒤에 있는 동일한 클라이언트 측 원칙으로,제가 전체 사례를 만듭니다 온라인 도구의 데이터 개인 정보 보호 기사.
자주 묻는 질문
cron 표현식은 어떻게 작성합니까?
표준 cron 표현식은 공백으로 구분된 다섯 개의 필드를 가지고 있습니다: 분,시, 월,월, 요일 각 필드는 특정 값,목록, 범위,단계 또는 * 모든. 예를 들어, 0 8 * * 1-5 월요일부터 금요일까지 08:00 을 의미합니다. 이 도구는 당신을 위해 표현을 구축하고 당신이가는 동안 그것이 의미하는 바를 보여줍니다.
5개의 크론 필드는 무엇을 의미합니까?
왼쪽에서 오른쪽으로 분 (0–59), 시간 (0–23), 월 (1–31), 월 (1–12) 및 요일 (0–6, 여기서 0 과 7 은 모두 일요일을 의미함) 입니다. 필드의 별은 "every" 해당 필드의 값을 의미합니다. 도구는 각 필드에 레이블을 지정하므로 순서를 기억할 필요가 없습니다.
무엇을 */5 크론으로 말인가요?
슬래시는 단계 값을 도입합니다. 분 필드에서, */5 는 "every 5 minutes" - 0,5, 10,15, 등등을 의미합니다. 당신은 범위를 가진 단계를 역시 결합할 수 있습니다: 0-30/10 분 필드에서 분 0,10, 20,30 을 의미합니다. 단계는 "every N units."를 표현하는 표준 방법입니다
요일 및 요일 설정으로 내 작업이 예상보다 더 자주 실행되는 이유는 무엇입니까?
가장 흔한 크론 서프라이즈입니다. 월일과 요일 필드가 모두 제한될 때 (둘 다 제한되지 않습니다 *), 표준 cron 은 그들을 AND 가 아닌 OR 로 취급합니다 - 두 조건 중 하나가 일치할 때 작업이 실행됩니다. 그래서 0 0 13 * 5 13 일 금요일뿐만 아니라 매월 13 일 및 매주 금요일에 실행됩니다. 하나의 필드를 그대로 둡니다 * OR 행동을 진정으로 원하지 않는 한.
다음 실행 시간은 어떤 시간대에 표시됩니까?
미리보기는 UTC 에서 다가오는 실행을 계산하므로 결과는 모든 사람에게 동일합니다. 실제 cron 데몬은 서버 시간대 (또는 TZ 설정) 를 사용하므로 서버가 다른 영역에서 실행되는 경우 그에 따라 시간을 오프셋합니다. 표현식 자체는 시간대를 전달하지 않습니다 - 스케줄러가 결정합니다.
숫자 대신 Mon 또는 Jan과 같은 이름을 사용할 수 있습니까?
예. 월 필드는 수락합니다 JAN 통해 DEC 그리고 요일 필드는 수락합니다 SUN 통해 SAT는,대소문자를 구분하지 않습니다. 도구는 표현식의 유효성을 검사하고 설명할 때 이를 이해합니다. 숫자 값은 스케줄러 간에 더 이식성이 높기 때문에 생성기는 숫자를 방출하지만 명명된 입력은 완전히 지원됩니다.
이것은 crontab 구문과 동일합니까?
예,이것은 crontab,대부분의 CI 시스템 및 Kubernetes CronJobs 에서 사용하는 표준 5 필드 Unix/Vixie cron 을 생성합니다. 일부 스케줄러는 6 초 필드 또는 비표준 확장자를 추가합니다 @reboot; 그것들은 5 필드 표준의 일부가 아닙니다. 스케줄링 요구의 절대 다수를 위해,이 도구가 생성하는 5 필드 표현식은 정확히 당신이 원하는 것입니다.
내 일정이 어디든지 보내지나요?
아니요. 표현식은 클라이언트 측 코드로 브라우저에서 완전히 빌드,검증, 설명 및 시뮬레이션됩니다. 업로드되거나 저장되는 것은 없습니다. 인터넷에서 연결을 끊으면이를 확인할 수 있습니다 - 발전기는 여전히 작동합니다.



