Розрахувати наступні виконання cron-виразу

аналізує та відображає наступні дати виконання cron-конфігурації

Що таке cron-вираз?

Cron-вираз - це короткий рядок, що описує повторення у часі. Успадкований від Unix формат складається з п'яти полів, розділених пробілами: хвилина, година, день місяця, місяць і день тижня. Цей синтаксис народився з демоном cron Брайана Кернігана у 1970-х, потім узагальнений Vixie cron (1987), підхопленим усіма сучасними дистрибутивами Linux та macOS. Сьогодні той самий синтаксис зустрічається у більшості хмарних планувальників (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) та CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── хвилина (0-59)
│ ┌── година (0-23)
│ │ ┌── день місяця (1-31)
│ │ │ ┌── місяць (1-12 або JAN-DEC)
│ │ │ │ ┌── день тижня (0-7 або SUN-SAT, 0 і 7 = неділя)
│ │ │ │ │
* * * * *

Добре сформований cron-вираз визначає точний cron schedule: кожне поле може бути фіксованим значенням, діапазоном, списком, кроком або зірочкою, що відповідає будь-чому. Компактність crontab expression є її силою, але саме це робить cron decoder незамінним для візуальної перевірки наміру. Це і є метою цього cron converter: виробляти читабельне пояснення cron, плюс список наступних виконань.

Анатомія cron-виразу

П'ять полів ділять спільну граматику. Ось межі, прийняті кожним стовпцем стандартного crontab expression:

  • Хвилина: 0-59.
  • Година: 0-23, 24-годинний формат.
  • День місяця: 1-31.
  • Місяць: 1-12 або текстові абревіатури JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • День тижня: 0-7 де 0 і 7 обидва представляють неділю, або абревіатури SUN, MON, TUE, WED, THU, FRI, SAT.

Спеціальні символи, спільні для п'яти полів:

  • *: any value, відповідає всім дозволеним значенням поля.
  • ,: дискретний список, наприклад 1,15,30 у полі хвилини.
  • -: включний діапазон, наприклад 9-17 для робочих годин.
  • /: крок (step), наприклад */15 = кожні 15 одиниць, або 0-30/5 = кожні 5 хвилин між 0 і 30.

Розширення Quartz (Java, AWS EventBridge, Spring): граматика збільшується до 6 або 7 полів з колонкою секунди спереду (0-59) і іноді колонкою рік ззаду (1970-2099). Quartz також вводить ? (no specific value), L (last), W (найближчий робочий день) і # (N-й день тижня місяця). Вираз Quartz зазвичай не сумісний з Unix crontab, і навпаки.

# UNIX / Vixie cron (5 полів)
0 9 * * 1-5

# Quartz (6 полів з секундами)
0 0 9 ? * MON-FRI

# Quartz (7 полів з роком)
0 0 9 ? * MON-FRI 2026

Навіщо декодувати cron-вираз?

Читати 0 0 * * * швидко. Читати */7 2-5 1,15 * 1-5 значно менше. Коли вираз виходить за рамки тривіального, ризик помилки інтерпретації зростає і cron decode стає повноцінним кроком перевірки.

  • Debug виробництва: зрозуміти, чому завдання спрацювало о 03:17, а не о 03:00, або виявити перекриття між двома завданнями.
  • Code review: перевірити, що планувальник, запропонований у pull request, дійсно робить те, що стверджує автор, без необхідності запам'ятовувати семантику кожного символу.
  • Аудит планувальників: переглянути cron jobs Linux у /etc/crontab та /etc/cron.d/, тригери Jenkins, spec.schedule Kubernetes CronJob, правила AWS EventBridge та завдання GCP Cloud Scheduler.
  • Міграція legacy: взяти старий /etc/crontab без документації і відновити карту завдань перед зміною інфраструктури.
  • Onboarding: дозволити новому розробнику перечитати crontab без необхідності вивчати всі спеціальні символи за один день.

Як користуватися cron decoder

Покрокова інструкція для декодування crontab expression за допомогою інструменту:

  1. Вставте ваш cron expression у поле введення (5 полів, розділених пробілами).
  2. Вкажіть кількість наступних виконань для обчислення.
  3. Натисніть convert для запуску cron decode: інструмент повертає людську фразу, що пояснює спрацювання, плюс датований список наступних виконань.
  4. Візуально перевірте, що дати відповідають вашому наміру (час, день, частота).
  5. Скопіюйте вивід за допомогою кнопки копіювання для вставки у тікет, PR або технічну документацію.

Інструмент не обмежується синтаксичним parsing: він надає пояснення cron природною мовою, що робить його одночасно cron decoder і валідатором розкладу.

Класичні приклади cron expression

Наведені нижче патерни охоплюють основні cron schedules, що зустрічаються у виробництві. Всі вони дійсні для Linux crontab, Kubernetes CronJob, GitHub Actions та більшості прикладних планувальників.

Вираз Людський прочит
* * * * * Щохвилини
0 * * * * Щогодини рівно
0 0 * * * Щодня о опівночі
0 0 * * 0 Щонеділі о опівночі
*/15 * * * * Кожні 15 хвилин
0 9 * * 1-5 О 9:00 з понеділка по п'ятницю
0 0 1 * * 1-го кожного місяця о опівночі
0 0,12 * * * О опівночі та опівдні щодня
*/5 9-17 * * 1-5 Кожні 5 хвилин у робочі години
30 2 1,15 * * 1-го і 15-го числа місяця о 2:30

Для виконання cron-завдання на Linux-сервері, редагуйте crontab користувача з оболонки:

# редагувати crontab поточного користувача
$ crontab -e

# перелічити існуючі завдання
$ crontab -l

# приклад доданого рядка: щоденне резервне копіювання о 3-й
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Приклад виводу cron converter для */5 * * * *:

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Часті запитання про cron decoder

В чому різниця між UNIX cron і Quartz?

UNIX/Vixie cron використовує 5 полів (від хвилини до дня тижня), без точності до секунди, і не має нативного поняття "останній день місяця". Quartz (Java, Spring, AWS EventBridge) додає колонку секунди спереду, іноді колонку рік ззаду, та кілька символів (?, L, W, #), відсутніх у Linux crontab. Вираз Quartz із 6 полями не є безпосередньо переносним до /etc/crontab, і навпаки. Наш cron decoder орієнтований на формат із 5 полів, що охоплює більшість планувальників.

Як виконувати cron-завдання кожні 5 хвилин?

З кроком / у полі хвилини:

*/5 * * * * /usr/local/bin/check-health.sh

Цей crontab expression запускає скрипт на хвилинах 0, 5, 10, 15... кожної години, щодня. Для обмеження робочими годинами з понеділка по п'ятницю, додайте обмеження на полях година і день-тижня: */5 9-17 * * 1-5.

Що означає зірочка (*) у cron-виразі?

Зірочка означає any value: вона відповідає всім дозволеним значенням поля. У 0 0 * * *, три зірочки означають "будь-який день місяця, будь-який місяць, будь-який день тижня". В поєднанні з двома першими полями, фіксованими на 0, отримуємо "щодня о опівночі". Зірочка може також поєднуватися з кроком: */15 у хвилині = кожні 15 хвилин.

Чи має crontab часовий пояс?

За замовчуванням, часовий пояс сервера. На Linux crontab, це системна TZ (часто UTC на VPS та контейнерах). GitHub Actions примусово UTC. Kubernetes CronJob використовує часовий пояс контролера, що налаштовується через spec.timeZone з версії 1.27. AWS EventBridge оцінює вирази в UTC. Прикладні планувальники (Symfony Scheduler, Quartz, Airflow) часто дозволяють встановити окремий часовий пояс для кожного завдання.

Cron job проти команди at: яку обрати?

cron служить для виконання повторюваного завдання за розкладом. at служить для виконання команди один раз у вказаний момент. Для щоденного резервного копіювання, ротації логів або регулярного виклику API, використовуйте cron. Для відкладення одноразової операції ("перезапусти це розгортання о 22:00 сьогодні ввечері"), використовуйте at:

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Як тестувати cron-вираз без його спрацювання?

Це саме і є роль цього cron converter: він обчислює N наступних виконань з поточного моменту, не запускаючи жодного завдання. Ви одразу бачите, чи ваш crontab expression спрацьовує о 03:00 як заплановано, або о 03:17 випадково. Для подальшої перевірки перед встановленням завдання, ви також можете тестувати скрипт окремо (bash -x script.sh) та перевіряти синтаксис файлу crontab за допомогою crontab -T file на дистрибутивах, що це підтримують.

Що відбувається, якщо день-місяця і день-тижня обидва фіксовані?

На Vixie cron (Linux), правило - логічне АБО: завдання спрацьовує якщо одне або з двох полів відповідає. Це неінтуїтивно та є джерелом помилок. Quartz використовує І, звідси введення символу ? для явної позначки "без обмежень". Як правило, встановлюйте лише одне з двох полів.

Приклад запиту

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Схема вхідних даних

Поле Тип Обов'язкове За замовчуванням
cron string
number_next_date integer

Точки доступу

  • GET https://cdrn.fr/api/v1/tools - перелічує всі доступні інструменти
  • GET https://cdrn.fr/api/v1/tools/cron-converter - отримує схему цього інструменту
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - виконує цей інструмент з JSON-payload