Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас

Cron-вирази

Перевірити cron-вираз і побачити наступні запуски

Дані не залишають ваш браузер

Цей інструмент повністю працює на вашому пристрої: обчислення виконує JavaScript у вкладці. Ми не надсилаємо введений текст на сервер, не зберігаємо і не логуємо його. Можете сміливо працювати з робочими даними - і навіть відключити інтернет після завантаження сторінки.

Що це означає

Наступні запуски

Поділитись

Як читається cron-вираз

П'ять полів, розділених пробілами:

┌─ хвилина (0-59)
│ ┌─ година (0-23)
│ │ ┌─ день місяця (1-31)
│ │ │ ┌─ місяць (1-12)
│ │ │ │ ┌─ день тижня (0-6, 0 = неділя)
│ │ │ │ │
0 3 * * 1     о 03:00 щопонеділка

Спецсимволи: * - будь-яке значення, , - перелік (1,15), - - діапазон (9-17), / - крок (*/15 - кожні 15).

Пастка, про яку майже ніхто не знає

Коли обмежені обидва поля дня - і день місяця, і день тижня - вони працюють через АБО, а не І.

0 0 1 * 1

Це не «першого числа, якщо це понеділок», а «першого числа і щопонеділка». Якщо потрібне саме перетинання, доводиться перевіряти день у самій задачі.

Інструмент вище враховує це правило, тому список наступних запусків показує реальну поведінку, а не інтуїтивну.

Типові вирази

Вираз Значення
* * * * * щохвилини
*/15 * * * * кожні 15 хвилин
0 * * * * щогодини рівно
0 3 * * * щодня о 03:00
0 9 * * 1-5 о 09:00 у будні
0 0 1 * * першого числа щомісяця
0 0 * * 0 щонеділі опівночі

У Laravel

Планувальник має власний, читабельніший синтаксис - сирий cron у ньому потрібен рідко:

// routes/console.php
Schedule::command('vacancies:check')->everyFifteenMinutes();
Schedule::command('report:daily')->dailyAt('03:00');
Schedule::command('digest:weekly')->weeklyOn(1, '09:00');

// Але сирий вираз теж приймається
Schedule::command('sync')->cron('0 3 * * 1');

Головне: у crontab потрібен лише один запис - той, що запускає планувальник щохвилини. Далі Laravel сам вирішує, чиї задачі час виконувати.

* * * * * cd /path && php artisan schedule:run >> /dev/null 2>&1

Чотири речі, які варто додати до задач

Schedule::command('report:heavy')
    ->dailyAt('03:00')
    ->withoutOverlapping()   // попередній запуск ще йде - не стартувати новий
    ->onOneServer()          // кілька серверів - виконає лише один
    ->runInBackground()      // не блокує решту розкладу
    ->timezone('Europe/Kyiv');

withoutOverlapping() рятує від класичної аварії: важка задача не встигає за інтервал, запуски накопичуються і кладуть сервер.

Пояс варто задавати явно для всього, що прив'язане до людського часу - інакше перехід на літній час зсуне «щоденну о 9:00» звітність (див. Unix timestamp про київський зсув).

Перевірка розкладу

php artisan schedule:list    # що і коли запуститься
php artisan schedule:run     # виконати те, що припадає на зараз
php artisan schedule:test    # запустити конкретну задачу вручну