Utilia

Cron израз: генератор и тест

Съставете cron израз поле по поле, прочетете го с прости думи, вижте следващите изпълнения във всяка часова зона и го преобразувайте за systemd или Quartz.

Конструктор

ПолеРежимСтойност
Минута0–59
Час0–23
Ден от месеца1–31, L
Месец1–12 или JAN–DEC
Ден от седмицата0–7 (0 и 7 = неделя) или SUN–SAT

Как да съставите cron израз

  1. Въведете или поставете израз в Cron израз или изберете такъв от Шаблони. Макроси като @daily или @weekly също се приемат.
  2. Или използвайте Конструктор: за всяко поле изберете Режим (Всеки, На всеки N, Конкретни стойности, Диапазон или Друго) и попълнете Стойност. Изразът се обновява, докато работите, а промяната на израза обновява конструктора.
  3. Отметнете Добави поле за секунди (6 полета), ако вашият планировчик поддържа секунди.
  4. Прочетете графика С прости думи (на езика на страницата, когато библиотеката за описание го поддържа), после проверете списъка Следващи изпълнения. Изберете Часова зона на сървъра, който изпълнява задачата, и Колко изпълнения да се покажат.
  5. Копирайте израза с Копирай или използвайте някой от Други формати.

Грешките се обясняват поле по поле, например „Минута: 61 е извън диапазона (0–59)“, така че знаете точно какво да поправите.

Петте полета на cron

Стандартен (Vixie) cron ред има пет полета, после командата:

Поле Допустими стойности
Минута 0–59
Час 0–23
Ден от месеца 1–31
Месец 1–12 или JAN–DEC
Ден от седмицата 0–7 (0 и 7 са неделя) или SUN–SAT

Всяко поле приема * (всяка стойност), списък 1,15, диапазон 9-17, стъпка */15 (на всеки 15 единици) или диапазон със стъпка 0-30/10. Така */15 9-17 * * 1-5 означава на всеки 15 минути от 9:00 до 17:45, от понеделник до петък.

Едно правило изненадва мнозина: когато са ограничени и Ден от месеца, и Ден от седмицата, класическият cron се изпълнява, когато съвпадне което и да е от двете. 0 0 13 * 5 се изпълнява всяко 13-о число и всеки петък, а не само в петък 13-о. В такъв случай инструментът показва предупреждение.

Следващи изпълнения и часови зони

Cron ползва часовника на машината или настройката CRON_TZ/TZ на crontab. Списъкът Следващи изпълнения се изчислява за избраната от вас часова зона, включително смените на лятно часово време: при пролетната смяна задача, зададена за 2:30, може да бъде пропусната, а наесен може да се изпълни веднъж или два пъти според реализацията. За задачи, които трябва да се изпълнят точно веднъж, предпочитайте часове извън 1:00–3:00 или използвайте UTC.

Vixie cron, systemd таймери, Quartz и AWS

  • systemd таймерите ползват OnCalendar= с различен синтаксис: Mon..Fri *-*-* 09..17:00/15:00. Условията за ден от седмицата и дата се комбинират с И, а не с ИЛИ, така че някои cron изрази нямат точен еквивалент.
  • Quartz и Spring поставят поле за секунди първо и може да добавят поле за година. Едно от двете полета за ден трябва да е ?, а Quartz номерира дните от седмицата от 1 до 7 започвайки от неделя, за разлика от 0–6 в cron. Инструментът записва дните с имена (MON-FRI), за да избегне този капан.
  • AWS EventBridge използва cron(минути часове ден месец ден-от-седмицата година): шест полета, без секунди, ? в едното поле за ден и година накрая.

Стандартният cron няма поле за секунди. Формата с 6 полета със секунди се поддържа от много библиотеки (node-cron, Spring, Quartz), но не и от системния crontab.

Често задавани въпроси

Как да изпълнявам задача на всеки 5 минути?

Използвайте */5 * * * *. Задачата се изпълнява в минути 0, 5, 10… на всеки час.

Как да изпълня задача в последния ден на месеца?

Много планировчици приемат L в полето за ден от месеца: 0 18 L * *. При чист Vixie cron изпълнявайте ежедневно на 28–31 число и проверявайте в скрипта дали утре е 1-во число.

Какво прави @reboot?

Изпълнява командата веднъж, когато cron демонът стартира. Няма график, затова инструментът не може да изброи часове на изпълнение за него.

Защо задачата ми не се изпълнява в показания час?

Проверете часовата зона на сървъра, crontab на потребителя спрямо /etc/crontab (който има допълнително поле за потребител) и PATH: cron стартира с минимална среда.

0 или 7 е неделя?

И двете. В полето за ден от седмицата 0 и 7 означават неделя, 1 е понеделник, а 6 е събота.