제가 쓴 가장 비싼 크론 표현은 다음과 같습니다 0 0 * * 0. 그것은 내가 구축 라라벨 SaaS 에 대한 주간 다이제스트 이메일을 실행,나는 절대적으로 확신했다 & quot;주말 날 자정.& quot; 그것은 자정 일요일을 의미한다. 내 정신 모델은 토요일 끝난 주를 말했다. 다섯 주 동안,고객은 자신의 & quot;week in review" 하루 늦게 이메일,그리고 팀의 아무도 cron 도 읽을 수 있기 때문에 그것을 잡았다 - 우리 모두는 단지 다섯 필드에 눈을 가늘게 뜨고 고개를 끄덕였다.
That's cron 문법의 더러운 비밀: 그것을 쓰는 거의 모든 사람들은 그들이 반쯤 기억하는 이전 표현식에서 패턴 일치이다. 형식은 마흔이 넘은 것으로,한 글자가 일정을 완전히 바꿀 정도로 조밀하며,묵묵히 실패한다. There's no compiler error for "runs on the wrong day." 누군가가 알아차릴 때까지 그 일은 잘못된 날에,영원히, 실행된다.
A cron 표현식 파서 그 틈을 닫습니다. 여러분은 표현식을 붙여넣습니다,그리고 그것은 여러분에게 평범한 영어로 실제로 무슨 일이 일어날지 알려줍니다 - 0 0 * * 0 "00:00 에 Sunday"에 - 플러스 다음 실행이 발사 될 때. 그 readback 단계는 일정을 배송하고 추측을 배송하는 것의 차이입니다. 나는 터미널로 컨텍스트 전환에 지쳤기 때문에 Toolz.dev 에 하나를 구축했으며 WP Adminify 에서 수년간 처리 한 wp-cron 혼란 때문에 스케줄링 버그가 소프트웨어에서 가장 인내심있는 버그라는 것을 가르쳐주었습니다.
이 가이드는 파서를 사용하는 방법, 5개 필드가 실제로 작동하는 방법(대부분의 생산 사고를 유발하는 두 가지 특징 포함), cron 구문이 다른 부분을 다룹니다 크론탭, GitHub Actions, Quartz 및 Laravel.
TL;DR: crontab 표현식을 붙여넣습니다 Toolz.dev 크론 파서 그리고 일반 영어 번역과 다가오는 실행 시간을 얻으십시오 - 즉시, 클라이언트 측, 가입 없음 일정을 배포하기 전에 항상 두 가지를 확인하십시오: 요일 번호 매기기 (0 과 7 은 모두 일요일임) 와 스케줄러가 실행되는 시간대 (GitHub Actions 는 항상 UTC 임) 와 페어링하십시오 타임스탬프 변환기 다음 실행 시간을 영역 전체에 걸쳐 변환해야 하는 경우 날짜 차이 계산기 간격을 온전하게 확인합니다.
주요 특징
일반-영어 번역
파서의 핵심 업무는 선회입니다 */15 9-17 * * 1-5 into "월요일,화요일, 수요일,목요일, 금요일에 9,10, 11,12, 13,14, 15,16, 17 시 지난 15 분마다." It's 장황한 - "9 부터 17" 를 축소하기보다는 열거합니다; 그리고 그 장황한 범위가 요점입니다. 열거는 모호하지 않습니다; 요약 된 범위는 잘못 읽을 또 다른 기회입니다. 문장은 풀 요청 설명에 붙여 넣거나 스탠드 업에서 큰 소리로 읽거나 기술적이지 않은 이해 관계자를 보여줄 수있는 것이 아닙니다. 원시 표현은 내 경험상 코드 검토 중에 번역이 가장 중요합니다: 다섯 개의 비밀 필드를 고무 스탬프로 찍을 검토자는 즉시 "wait, 작업이 오후 5 시에 중단되어야 할 때 왜 17 시간이 나타나는가?" 매 시간 철자가 나올 때 번역은 일정을 위조 가능하게 만듭니다. 이는 정확히 원시 cron 구문이 실패하는 것입니다.
다음 실행 미리보기
어떤 표현인지 아는 것 수단 문제의 절반인가; 언제인지 아는 것 다음에 발사합니다 나머지 절반입니다. 파서는 다음 5 번의 실행 시간을 계산하므로 의도에 대해 눈알을 볼 수 있습니다. 이것은 미묘한 실수가 표면화되는 곳입니다 - 영어로 잘 읽지 만 "in 27 days"의 다음 실행을 생성하기 때문에 월일과 월을 혼동했거나 주말 후 03:00 을 의미했을 때 오늘 밤 03:00 에 발사되는 것입니다. 나는 지금 매번 다음 실행 목록을 확인하며,표현 I & #39;m confident about 에 대해서도 마찬가지입니다. 특히 표현식 I & #39;m confident about - 오프닝 일화를 참조하십시오.
그 시간들이 어떻게 계산되는지에 대한 두 가지 세부사항. 첫째,they're evaluated in 귀하의 브라우저's 로컬 시간대,UTC 가 아니고 당신의 server's zone 이 아니라 - 각 실행은 두 번 보여지며,한 번은 로컬 타임스탬프로,한 번은 동등한 UTC 인스턴트로 보여지므로 배포 대상과 일치하는 것을 읽을 수 있습니다. 둘째,월일과 요일이 모두 제한되면 파서는 AND: 가 아닌 실제 cron's OR 의미론을 적용합니다 0 0 1 * 1 월 1 일에 화재 그리고 매주 월요일,1 일인 월요일뿐만 아니라. 그 규칙은 경험 많은 사람들을 넘어 뜨리고,5 개의 구체적인 날짜를 보는 것은 문장이 결코하지 않는 방식으로 명백하게합니다.
거친 가장자리 하나: 불가능한 표현입니다 0 0 30 2 * (2 월 30 일) 유효한으로 구문 분석, "로 행복하게 자신을 설명 00:00 월 30 일, 월, " 그리고 빈 다음 실행 목록을 보여줍니다. 빈은 결코 의미하지 않습니다. It's 는 정확하지만 it's 조용한 - a "this schedule will never fire" warning is the obsible improvement and I haven't build it yet.
필드별 분석
파서는 표현식을 5 개의 구성 요소 - 분,시간, 월,월, 요일 - 로 분할하고 각각이 기여하는 것을 보여줍니다. cron 오류는 거의 항상 단일 필드 문제이기 때문에 중요합니다: 잘못된 열의 올바른 값. 0 12 * * * (매일 정오) 그리고 12 0 * * * (매일 오전 12:12... 아니, 매일 00:12) 한 스왑 떨어져 있습니다. "hour: 0"를 보면 명시적으로 레이블이 지정되어 2주가 아닌 2초 안에 스왑을 잡을 수 있습니다.
범위, 단계 및 목록을 지원합니다
실제 표현식은 연산자 구문에 크게 의존합니다: 1-5 범위, */10 단계, 1,15 목록 및 조합과 같습니다 0 8-18/2 * * 1,3,5. 파서는 인간의 독자를 넘어 뜨리는 결합 된 형태를 포함하여 모든 것을 처리합니다. 범위에 대한 단계 값 - 8-18/2 의미 "8 에서 18 & quot 까지 2 시간마다; - 합법적이고 유용하며 도구없이 거의 읽을 수 없습니다. you & # 39;이 떠난 sysadmin 으로부터 이것들로 가득 찬 crontab 을 상속받은 적이 있다면이 기능이 존재하는 이유를 알 수 있습니다.
엄격한 5 분야 검증 (무엇을 원했는가를 포함하여't 수락)
파서는 표준 5 필드 표현식을 취하고 다른 것은 없습니다. 붙여 넣기 @daily 그리고 당신은 오류를 얻을 - "예상 5 필드 (분 시간 월 일 월 일), 1" 을 얻었다; - 번역이 아닙니다. 에 대한 동일 @hourly, @weekly, 그리고 @reboot. That's 는 디자인 원리 보다는 오히려 진짜 간격,그리고 I'd 는 당신이 중간 디버그를 알아내게 하는 보다는 오히려 이렇게 말합니다; 약칭 매크로는 공구에 속하는 진짜 crontabs 에서 충분히 일반적입니다. they're in 까지,수동으로 번역하십시오: @hourly 이다 0 * * * *, @daily 이다 0 0 * * *, @weekly 이다 0 0 * * 0, @monthly 이다 0 0 1 * *, @yearly 이다 0 0 1 1 *. @reboot 5개 필드에 해당하는 항목이 전혀 없습니다. 일정에 따라 isn't이며 데몬 시작 시 한 번 실행됩니다. 이는 crontab에서 마이그레이션을 실행하는 많은 사람들을 놀라게 했습니다.
엄격함은 다른 곳에서도 성과를 냅니다. 6 필드 Quartz 표현식은 묵묵히 잘못 읽는 대신 필드 카운트로 거부됩니다. 범위를 벗어난 값은 필드와 법적 범위의 이름을 지정합니다 (Value 25 out of range for hour (allowed 0-23)). 반전된 범위는 다음과 같습니다 5-1 잡히게 됩니다. 그리고 그것은 실제 crontabs 가 포함하는 것들을 받아들입니다: 월과 일 이름 (JAN, SUN), 7 sunday의 두 번째 철자법이자 Vixie입니다 5/15 form 의미 "every 15 starting at 5". worth knowing while you're 그 매크로들을 손으로 번역하는 중: every @daily 서버에서의 작업은 같은 순간, 즉 자정에 실행되므로 그 중 40개는 야간 로드 스파이크입니다. 나는 이상한 분에 걸쳐 내 것을 분산시킵니다(17 3 * * *, 43 4 * * *) 바로 그 이유 때문이다.
클라이언트측 처리
파서는 브라우저에서 완전히 실행됩니다. 붙여 넣기 한 것은 업로드되거나 기록되거나 저장되지 않습니다. crontabs 가 실제로 포함 된 것을 기억할 때까지 상용구 개인 정보 보호 언어처럼 들립니다: 백업 일정,청구 실행 타이밍,보안이 발사되는 정확한 분. 인프라 스케줄링은 정찰 데이터입니다. 다른 사람들로부터 그것을 지키기's 서버 isn't 편집증; it's 는 단지 아무도 존재할 필요가없는 문제를 만들지 않습니다.
Cron Parser 사용 방법
1단계: 표현을 붙여넣거나 입력하세요
열다 크론 파서 그리고 표현식을 삭제하세요 - crontab 파일에서 a schedule: github Actions 워크플로, Kubernetes CronJob 매니페스트 또는 Laravel에서 차단합니다 ->cron() 호출. 표준 5 필드 구문은 그대로 작동합니다; @daily 그리고 그 형제 don't,그러니 그것들을 다섯 개의 필드로 먼저 확장하세요. 그리고 나서 Parse 를 누르세요. 만약 you're 가 디코딩이 아닌 처음부터 시작한다면,사전설정된 버튼들 (매분,시간별, 자정의 매일,월 1 일 주중 오전 9 시) 은 필드별로 수정할 수 있는 작업 표현식을 로드하고,가면서 다시 파싱합니다.
2단계: 번역을 다시 읽어보세요
이것은 단계 사람들이 건너 뛰고 should't. 일반 - 영어 출력을 읽고 당신의 머리에 문장과 비교합니다. 당신은 "every Monday at 9 AM"를 의도하는 표현을 쓴 경우 그리고 readback 는 말한다 "At 09:00 on day-of-month 1" - 축하,당신은 단지 생산하기 전에 고전적인 열 스왑을 잡았다. readback 은 당신의 단위 테스트입니다.
3단계: 다음 실행 시간을 확인합니다
다가오는 5 건의 처형을 확인하십시오. 날짜가 예상대로 착륙합니까? 오늘 밤,내일 또는 다음 달에 첫 번째 실행입니까? 실행 사이의 격차에주의하십시오 - 잘못된 위치 */ 단계는 "every 6 hours"로 "every minute of every 6th hour" (* */6 * * * 대 0 */6 * * *), 그리고 6시간 간격이 아닌 1분 간격으로 5런을 실행하는 것은 놓치기 어렵습니다. 빈 목록은 일정이 결코 실행될 수 없음을 의미합니다.
4단계: 배포하기 전에 시간대를 설명합니다
파서가 알려줍니다 언제 시계에 상대적인; 스케줄러가 결정합니다 누구의 시계. 배포하기 전에 실행 시스템에서 사용하는 시간대를 확인합니다. GitHub 작업: 항상 UTC,예외 없음. 서버: OS 가 설정되어 있는 것이 무엇이든 클라우드 상자에서 자주 UTC 로 설정됩니다. Laravel: 앱 시간대,체인을 하지 않는 한 ->timezone(). 다음 실행 시간을 번역합니다 타임스탬프 변환기 로컬 존이나 customer's 에서 봐야 한다면.
기술 심층 분석: Cron Expression이 실제로 작동하는 방식
5 개 분야 체재는 1980 년대 후반에 있는 폴 Vixie's cron 실시에서 실제적으로 표준화된 유닉스 cron 에서 온다 - 에서 문서화되는 것 crontab(5) 그리고 여전히 배송, 자손 형태로, 대부분의 리눅스 시스템에서 오늘. 필드, 왼쪽에서 오른쪽으로:
| 필드 | 허용된 값 | 노트 |
|---|---|---|
| 분 | 0~59 | |
| 시간 | 0~23 | 24시간제, 0은 자정입니다 |
| 월의 날 | 1~31 | 31일이 없는 달을 조심하세요 |
| 월 | 1~12년 또는 1월~12월 | Vixie cron에서 허용되는 이름입니다 |
| 요일 | 0–7 또는 SUN–SAT | 0 과 7 은 모두 일요일이다 |
각 필드는 수락합니다 * (모든 값), 목록 (1,15), 범위(1-5) 및 단계(*/10 또는 20-59/5). That's 전체적인 문법. 구문의 복잡성 isn't - it's in three behavioral quirks.
퀴크 1: 요일 0. 페르 crontab(5)0 과 7 모두 일요일을 의미합니다. 일부 오래되거나 엄격한 구현에서는 0 만 허용합니다. 쿼츠 - 젠킨스가 사용하는 자바 스케줄러와 엔터프라이즈 소프트웨어의 절반 - 숫자 일 1–7 에서 시작 일요일그래서 Quartz's 2 월요일인데 crontab's 2 화요일입니다. 시스템 간에 일정을 마이그레이션하는 경우 이 오프바이원은 대기 중입니다. 항상 구문 분석하고 절대 기록하지 마십시오.
퀴크 2: 월별 또는 주별. Here's 는 거의 아무도 그들을 물기 전까지는 알지 못합니다. 언제 둘 다 월 일 및 요일 필드는 제한됩니다 (둘 다 마찬가지입니다 *), Vixie cron이 작업을 실행할 때 둘 중 하나 일치 - AND가 아닌 OR입니다. 그래서 0 0 13 * 5 doesn't 는 "13 일의 금요일을 의미합니다." 그것은 "매월 13 일마다 그리고 매주 금요일을 의미합니다." 이것은 문서화 된 동작입니다 crontab(5) 그리고 그것은 매우 반직관적입니다. 만약 당신이 진정으로 "13 일의 금요일, " 스크립트 쪽 날짜 검사 또는 더 풍부한 구문을 가진 스케줄러가 필요합니다.
퀴크 3: 시간대와 DST. Cron 에는 timezone 필드가 없습니다. 표현식은 scheduler's 현지 시간에서 해석됩니다. 그것이 무엇이든간에. 두 가지 구체적인 결과:
- GitHub 작업이 실행됩니다
schedule:UTC, 완전 정지에서 트리거됩니다. 에서 예정된 워크플로입니다0 9 * * *utc does't 는 DST 를 관찰하지만 당신의 의도 audience's 시계가하기 때문에 계절에 따라 뉴욕에서 오전 9 시 UTC - 오전 4 시 또는 오전 5 시에 화재. 당신의 "오전 9 시 일일 보고서" 워크 플로우를 조정하거나 코드로 처리하지 않는 한 일년에 두 번 한 시간씩 표류합니다. - DST-observing zone 으로 설정된 서버에서는 1 년에 하룻밤 02:00–03:00 hour doesn't 가 존재하고,하룻밤은 두 번 일어난다. 02:30 에 예정된 작업은 구현에 따라 건너 뛰거나 이중으로 발사됩니다. 지루하고 올바른 수정: 로컬 01:00 – 03:00 외부에서 중요한 작업을 예약하거나 UTC 에서 서버를 실행합니다. 나는 둘 다.
확장 형식. Quartz는 6~7개의 필드(앞의 초 필드 및 선택적인 후행 연도)와 다음과 같은 추가 연산자를 사용합니다 L (마지막), W (가장 가까운 평일), 그리고 # (월 n 번째 평일). 일부 크론도 선도 초 필드를 지원합니다. 표현식에 6 개의 필드가 있고 you'어떤 방언인지 확실하지 않은 경우 파서에 붙여 넣으십시오 - 5 필드로 해석되는 6 필드 표현식은 눈에 띄게 잘못된 출력을 생성하며 그 자체가 진단적입니다. 그리고 @reboot특별한 끈의 이상한 오리, isn't는 일정 전혀: 현대 체계에 "상자가 재시작할 때마다 의미하는 데몬 시작에 한 번 달린다, " crontab에서 데이타베이스 마이그레이션을 달리는 많은 사람들을 놀라게 한 사실.
일정 작업과 짝을 이루는 개발자 유틸리티에 대한 광범위한 투어를 위해 코딩 도구 가이드 전체 도구 상자를 덮습니다.
일반적인 사용 사례
Laravel 스케줄러 항목 디버깅
Laravel's 스케줄러는 유창한 방법으로 cron을 감싸줍니다 - ->dailyAt('03:00'), ->weeklyOn(1, '8:00')- 그런데 탈출구, ->cron('*/5 * * * 1-5')는 원시 crontab 구문이고,복잡한 스케줄이 거기에 이르게 됩니다. 시스템 crontab 이 실행됩니다 schedule:run 매 분마다,그리고 라라벨은 내부적으로 what's due 를 결정합니다. 예약된 명령이 isn't 발사를 할 때,나의 첫번째 동작은 the 를 붙여넣는 것입니다 ->cron() 그것을 확인하기 위하여 파서에 끈은 위에 코멘트가 주장하는 무슨을 의미한다. 대략 절반 시간,그것은 does't. 다른 반은,버그 timezone 이다: app 는에 놓인다 UTC 개발자가 현지 시간을 가정한 동안. 파서는 첫 번째 경우를 몇 초 만에 해결하고 두 번째 경우를 손가락으로 가리 킵니다.
WordPress 사이트에서 wp-cron을 풀고 있습니다
WordPress 는 wp-cron 으로 배송됩니다. isn't cron 은 전혀 - it's 페이지 방문에 피기백하는 의사 스케줄러이므로 트래픽이 적은 사이트's "hourly" 작업은 4 시간마다 실행될 수 있으며 트래픽이 많은 사이트는 모든 요청에 대해 작은 세금을 지불합니다. 내 WP 관리 년 동안 이것은 "예정 된 게시물 aren't 게시" 보고서의 꾸준한 스트림을 생성했습니다. 표준 수정은 wp-cron 을 비활성화하는 것입니다 (DISABLE_WP_CRON) 및 트리거링 wp-cron.php 실제 서버 crontab 에서 - 어느 시점에서 you're 실제 cron 표현식을 작성,보통 */5 * * * *그리고 파서는 계속해서 이를 확인합니다. WordPress를 어떤 규모로든 실행한다면 이 마이그레이션은 언젠가 할 가치가 있는 것이 아니라 이번 주에 할 가치가 있습니다.
GitHub 작업 일정을 확인합니다
CI 일정은 조용히 실패: doesn't 페이지 누구를 실행 중지 야간 빌드. a 를 작성할 때 schedule: 트리거,나는 표현을 구문 분석하고 다음 실행 시간을 살펴본 다음 정신적으로 UTC 오프셋을 추가합니다. Actions 에 특정한 두 가지 추가 세부 정보: 일정은 기본 브랜치에서만 실행되며 실행은 고부하 기간 동안 지연되거나 삭제될 수 있습니다 - GitHub's own docs say so. 정확한 타이밍이 중요하다면 cron-triggered Actions 는 잘못된 도구입니다; if approximate timing is fine, at least make the approximate time the 오른쪽 대략적인 시간.
상속된 Crontab을 감사합니다
모든 장수 서버는 더 이상 그곳에서 일하지 않는 사람들이 작성한 crontab 을 축적합니다. 실행 crontab -l 그리고 파서를 통해 각 줄을 붙여넣는 것이 제가 아는 가장 빠른 감사입니다: 10분 이내에 일반 영어 일정 목록이 있고 거의 항상 아무도 기억하지 못하는 작업을 수행하는 적어도 하나의 작업을 찾을 수 있습니다. 백업이 두 번 실행되고 정리 스크립트가 실행됩니다. 예정된 날짜와 일치하지 않았습니다 * * * * * 그랬어야 했어요 0 * * * * API 를 한 시간에 예순 번 망치질하기. 이전 crontab 을 마이그레이션 중에 새 것과 비교할 때,the 텍스트 차이 도구 파서와 함께 검토를 기계적으로 만듭니다.
쿠버네티스 크론잡스 예약
K8s CronJobs는 표준 5필드 구문을 사용하며 1.27부터 명시적 구문을 지원합니다 timeZone 필드 - 클래식 크론에 비해 진정한 개선. 파서 워크플로는 동일합니다: 표현식을 확인하고 다음 실행을 확인한 다음 확인합니다 startingDeadlineSeconds 그리고 concurrencyPolicy 실패 모드 cron 자체를 커버 does't. 표현식은 완벽할 수 있으며 느린 실행이 다음 트리거와 겹치는 경우 작업은 여전히 쌓입니다; 파서는 일정을 올바르게 가져와 대신 해당 운영 설정에 주의를 기울일 수 있습니다.
크론 방언 비교
| 빅시 크론 / 크론탭 | GitHub 작업 | 석영 | 라라벨 스케줄러 | systemd 타이머 | |
|---|---|---|---|---|---|
| 필드 | 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 | 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 | 6–7(초, 연도) | 5 (경유 ->cron()) |
OnCalendar cron이 아닌 구문입니다 |
| 요일 번호 매기기 | 0~7(0 및 7 = 태양) | 0~6(0 = 태양) | 1–7(1 = 태양) | crontab을 따릅니다 | 이름 (Mon, Tue) |
| 시간대 | 시스템 로컬 | 항상 UTC | 구성 가능 | 앱 시간대 또는 ->timezone() |
시스템 로컬 또는 Timezone= |
| 특수 현 | @daily, @reboot등. |
지원되지 않음 | 지원되지 않음 | 대신 유창한 방법 | OnBootSec=, 달력 속기 |
| 초 정밀도 | 아니요 | 아니요(최소 ~5분 실용) | 예 | 아니요(분당 틱) | 예 |
| 위한 최고의 | 서버 작업 | CI/CD 일정 | JVM 생태계 | 라라벨 앱 | 현대 리눅스 서비스 |
언제 어떤 것을 사용해야 하는가: 일반 서버 작업에 대한 crontab, 최신 Linux에서 무료로 로깅 및 종속성 처리를 원할 때 systemd 타이머, 작업이 어쨌든 앱 내부에 있을 때 프레임워크 스케줄러, 퍼지 타이밍을 허용하는 CI 작업에 대해서만 작업 일정을 선택합니다. 어느 것을 선택하든 5필드 표현식은 링구아 프랑카입니다. 이것이 바로 이 표현을 유창하게 말하는 파서가 나머지 항목 옆에 있는 북마크에 속하는 이유입니다 웹 개발자 툴킷.
자주 묻는 질문
Cron 표현식 파서란 무엇입니까?
cron 표현식 파서는 crontab 구문을 읽는 도구입니다 */15 9-17 * * 1-5- 그리고 일반적으로 다음 실행 시간의 미리보기와 함께 일반 영어 일정 설명으로 변환합니다. 이를 통해 프로덕션에서 잘못된 시간에 작업이 실행될 때 잘못 읽힌 필드를 발견하는 대신 일정을 배포하기 전에 실제로 수행하는 작업을 확인할 수 있습니다.
크론 표현식의 다섯 가지 필드는 무엇을 의미합니까?
왼쪽에서 오른쪽으로: 분 (0–59), 시간 (0–23), 월 (1–31), 월 (1–12), 요일 (0–7, 여기서 0 과 7 모두 일요일을 의미함) 각 필드는 수락합니다 * 모든 값에 대해 쉼표 목록, 하이픈 범위 및 / 단계 값. 그래서 30 2 1 * * 매월 첫째 날 02:30 을 의미합니다.
왜 내 cron 작업이 잘못된 시간에 실행됩니까?
가장 일반적인 두 가지 원인은 시간대와 필드 혼동입니다. Cron 은 스케줄러에서 실행됩니다's 현지 시간 - GitHub Actions 는 항상 UTC 를 사용하고 많은 클라우드 서버도 사용합니다 - 그래서 "9 AM"에 예약된 작업이 벽시계에서 몇 시간을 끌 수 있습니다. 다른 고전은 시간 값을 분 열에 넣는 것과 같은 필드를 교환하는 것입니다. 표현식을 구문 분석하고 다음 실행 시간을 확인하는 것은 둘 다 잡습니다.
0 과 7 은 모두 일요일이 cron 인가요?
Vixie cron과 대부분의 Linux 구현에서는 그렇습니다 crontab(5) 맨 페이지는 일요일에 0 과 7 을 모두 허용합니다. 그러나 이것은 보편적이지 않습니다: 석영 번호 일 1 – 7 일 일요일부터 시작하며 일부 엄격한 파서는 7 을 거부합니다. 시스템간에 표현식을 이동할 때 번호 매기기가 이월된다고 가정하지 않고 요일 필드를 다시 확인합니다.
무엇을 0 0 13 * 5 실제로?
Not "13 일의 금요일." 월일과 요일이 모두 제한되면 표준 cron 은 그들을 OR 로 취급합니다: 작업은 매월 13 일에 실행됩니다 그리고 매주 금요일에. 이것은 문서화 된 Vixie cron 동작과 format's 가장 오해 된 규칙 중 하나입니다. true AND 가 필요한 경우 스크립트 자체 안에 날짜 검사를 추가하십시오.
일광 절약 시간제는 크론 작업에 어떤 영향을 미치나요?
DST 관찰 시간대의 서버에서,현지 시간 01:00 에서 03:00 사이에 예약된 작업은 구현에 따라 실행을 건너뛰거나 (시계가 앞으로 점프할 때) 두 번 실행하거나 (뒤로 떨어질 때) 실행할 수 있습니다. 가장 안전한 패턴은 UTC 에서 서버를 실행하거나 해당 창 밖에서 중요한 작업을 예약하는 것입니다. GitHub Actions don't skip runs 와 같은 UTC 기반 스케줄러는 1 년에 두 번 한 시간씩 교대 근무에 해당하지만 현지 시간은.
이다 @daily 와 같습니다 0 0 * * *?
예 - @daily (그리고 그 동의어 @midnight)는 정확히 확장됩니다 0 0 * * * vixie cron 에서. 두 가지 주의 사항. 먼저 Toolz.dev 파서는 5 필드 표현식만 허용하므로 붙여 넣습니다 0 0 * * * 보다는 @daily 지금은요. 둘째,모든 @daily 작업은 같은 순간에 실행되므로 많은 서버가 자정 로드 스파이크를 얻습니다. 매일 작업을 시차를 두고 몇 분, 몇 시간 동안 분산하면 자해로 인한 천둥소리를 피할 수 있습니다.
Toolz.dev cron 파서가 내 표현식을 업로드합니까?
아니요. 크론 파서 브라우저에서 완전히 실행 - 표현식은 클라이언트 측에서 구문 분석되며 서버로 전송되거나 기록되거나 저장되지 않습니다. crontabs 는 백업 타이밍 및 청구 실행과 같은 운영 세부 정보를 공개하므로 타사 서버에서 차단하는 것이 합리적인 기본값이며 브라우저에서 직접 동작을 확인할 수 있습니다's 네트워크 탭.
배송하기 전에 다시 읽어보세요
하루 늦게 도착하는 5 주간의 다이제스트 이메일은 극적인 중단이 아닙니다. 아무도 나를 호출하지 않았습니다. That's 정확히 무엇이 일정 버그를 비싸게 만드는지: 그들은 don't 자신을 발표하고 고객이 지나갈 때 언급 할 때까지 조용히 잘못된 일을합니다. 나를 위해 그것을 고친 습관 isn't 규율 또는 현장 주문을위한 더 나은 메모리 - it's 삼십초의 재회. 표현을 붙여 넣기,영어 문장을 읽고,다섯 개의 구체적인 날짜를 본 다음 배포하십시오.
보관하세요 크론 파서 도구 옆에 you'll 도달 for 에 동일한 디버깅 세션: the 타임스탬프 변환기 다음 실행 시간이 영역 사이를 이동해야 하는 경우 (I've written up the 유닉스 타임스탬프 트랩 그게 가장 세게 물렸어요) 날짜 차이 계산기 온전한 상태를 확인하는 간격 및 텍스트 차이 도구 마이그레이션 중에 이전 crontab과 새 crontab을 비교하는 경우 When you're. 그만큼 코딩 도구 가이드 세트가 어떻게 조화를 이루는지 살펴보고 모든 것이 클라이언트 측에서 실행됩니다. 백업 및 청구가 실행되는 시기를 정확하게 문서화하는 파일의 경우 이것이 유일하게 합리적인 기본값입니다.



