Tools Blog

Розуміння виразів Cron: практичний посібник з автоматизації завдань

Cron Job Automation

Якщо ви коли-небудь керували сервером Linux, працювали над серверною розробкою або налаштовували автоматизовані хмарні функції, ви, ймовірно, стикалися з рядком, який виглядає приблизно так: 0 2 * * *. Для непосвячених це виглядає як друкарська помилка на клавіатурі. Для системних адміністраторів це серцебиття сучасної автоматизації інфраструктури: Cron Expression.

Cron — це невидимий механізм, який керує Інтернетом. Він забезпечує резервне копіювання вашої бази даних о 3:00 ночі, запускає електронні листи, які ви отримуєте щопонеділка вранці, і очищає тимчасові файли сервера, перш ніж вони призведуть до збою системи. Але, незважаючи на його силу, синтаксис, як відомо, важко розібрати людям. У цьому глибокому зануренні ми розвіємо таємниці зірочок і навчимо вас читати та писати розклади cron, як досвідчений інженер DevOps.

Що таке Cron і Crontab?

Cron — це планувальник завдань на основі часу, який є в Unix-подібних комп’ютерних операційних системах. Назва «крон» походить від грецького слова хронос, що означає час. Користувачі, які встановлюють і обслуговують програмне середовище, використовують cron для планування виконання завдань (команд або сценаріїв оболонки) для періодичного виконання у фіксований час, дати або інтервали.

Crontab (Cron Table) — це файл конфігурації, у якому зберігаються ці розклади. Коли ви редагуєте свій crontab через термінал, ви пишете список інструкцій, які повідомляють серверу, що саме і коли виконувати.

Деконструкція 5 зірочок

Стандартний вираз cron складається з 5 полів, розділених пробілом. Кожне поле представляє певну одиницю часу, і вони завжди читаються зліва направо в такому порядку:

* * * * *  command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)

Зірочка (*) означає «кожне можливе значення для цього поля». Отже, вираз * * * * * буквально перекладається як: «Бігати щохвилини, кожної години, кожного дня, кожного місяця, кожного дня тижня».

Модифікатори синтаксису: кроки, діапазони та списки

Потужність cron походить від його модифікаторів. Ви не обмежені лише конкретними цифрами чи «всім».

1. Модифікатор кроку (/)

Якщо ви хочете, щоб сценарій запускався кожні 15 хвилин, ви використовуєте крок. */15 * * * * означає «кожну хвилину, яка ділиться на 15». Він працюватиме о 0, 15, 30 і 45 останньої години.

2. Модифікатор діапазону (-)

Якщо ви хочете, щоб сценарій запускався лише в робочий час, ви використовуєте діапазон. 0 9-17 * * * означає «запуск на нульовій хвилині, щогодини з 9:00 до 17:00».

3. Модифікатор списку (,)

Якщо ви хочете, щоб щось запускалося в певні непослідовні дні, використовуйте список. 0 0 1,15 * * означає «запускати опівночі 1-го та 15-го числа місяця».

Припиніть вгадувати вирази Cron

Не ризикуйте запускати сценарій резервного копіювання щохвилини замість кожного місяця. Одна помилка може призвести до збою робочого сервера. Використовуйте наш інтерактивний візуальний генератор для безпечного створення та перевірки рядків cron.

Відкрийте Cron Job Generator

Найнебезпечніша помилка Cron

Найпоширенішою і катастрофічною помилкою розробників є плутання поля «Хвилини». Давайте розглянемо сценарій, коли ви хочете запускати сценарій очищення бази даних раз на годину о 2:00 ночі.

Помилка: * 2 * * *

Якщо ви пишете вище, ви повідомляєте серверу запускати сценарій «Кожної хвилини, протягом 2-ї години дня». Ваш інтенсивний сценарій очищення бази даних запускатиметься 60 разів поспіль, імовірно, це перевантажить ваш ЦП, заблокує таблиці бази даних і спричинить масовий збій.

Правильний шлях: 0 2 * * *

Це явно вказує серверу працювати лише о «нульовій хвилині 2-ї години». Він виконається рівно один раз о 2:00 ночі.

Часті запитання (FAQ)

Чи враховує cron часові пояси?

За замовчуванням cron оцінює вирази на основі локального системного часу сервера, на якому він працює. Якщо ваш сервер розміщено в регіоні AWS у Лондоні, він працює за UTC/GMT. Ви повинні враховувати різницю в часових поясах, якщо ваші користувачі перебувають у Нью-Йорку чи Токіо.

Чи можу я запланувати виконання завдання cron щосекунди?

Ні. Стандартний cron Unix обмежений однією хвилиною. Якщо вам потрібне невелике планування (наприклад, кожні 10 секунд), ви повинні використовувати окремий інструмент-демон або написати сценарій, який виконується щохвилини, але зациклюється внутрішньо з командами сну.

Що означають такі рядки, як @daily або @hourly?

Багато сучасних реалізацій cron підтримують нестандартні попередньо визначені макроси, щоб полегшити планування. @daily точно те саме, що 0 0 * * * (опівночі щодня). @hourly те саме, що 0 * * * *. Незважаючи на те, що вони корисні, вони не підтримуються у всіх застарілих системах.