Tools Blog

Понимание выражений Cron: практическое руководство по автоматизации задач

Cron Job Automation

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

Cron — это невидимый механизм, управляющий Интернетом. Он обеспечивает резервное копирование вашей базы данных в 3:00 утра, запускает отправку электронных писем, которые вы получаете каждый понедельник утром, и очищает временные файлы сервера до того, как они разрушат систему. Но, несмотря на свою мощь, синтаксис, как известно, сложен для анализа людьми. В этом глубоком погружении мы развеем тайну звездочек и научим вас читать и писать расписания cron, как опытный DevOps-инженер.

Что такое Cron и Crontab?

Cron — это планировщик заданий, основанный на времени, который можно найти в Unix-подобных компьютерных операционных системах. Название «крон» происходит от греческого слова chronos, обозначающего время. Пользователи, которые настраивают и обслуживают программные среды, используют cron для планирования периодического запуска заданий (команд или сценариев оболочки) в фиксированное время, даты или интервалы.

Crontab (таблица Cron) – это файл конфигурации, в котором хранятся эти расписания. Когда вы редактируете свой 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

Самая опасная ошибка Cron

Самая распространенная и катастрофическая ошибка разработчиков — путать поле «Минута». Давайте рассмотрим сценарий, в котором вы хотите запускать сценарий очистки базы данных один раз в час в 2:00 ночи.

Ошибка: * 2 * * *

Если вы пишете вышеизложенное, вы указываете серверу запускать скрипт «Каждую минуту, в течение 2-го часа дня». Сценарий тяжелой очистки базы данных сработает 60 раз подряд, что, вероятно, перегрузит ваш процессор, заблокирует таблицы базы данных и приведет к массовому сбою в работе.

Правильный способ: 0 2 * * *

Это явно указывает серверу работать только в «нулевую минуту второго часа». Он будет выполнен ровно один раз в 2:00 ночи.

Часто задаваемые вопросы (FAQ)

Учитывает ли cron часовые пояса?

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

Могу ли я запланировать выполнение задания cron каждую секунду?

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

Что означают такие строки, как @daily или @hourly?

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