Cron (Command Run ON) — система для автоматического запуска программ и скриптов на сервере в определённое время.

Crontab (таблица cron) представляет собой текстовый файл, который определяет расписание заданий cron. Существует два типа файлов crontab. Общесистемные файлы crontab и отдельные пользовательские файлы crontab.

Файлы crontab пользователей именуются в соответствии с именем пользователя, и их расположение зависит от операционной системы. В дистрибутивах на основе Red Hat, таких как CentOS, файлы crontab хранятся в каталоге /var/spool/cron, а файлы Debian/Ubuntu/LMDE хранятся в каталоге /var/spool/cron/crontabs.

Основным общесистемным файлом crontab является файл /etc/crontab.

Журналы Cron хранятся в системном журнале /var/log/syslog в системах Debian/Ubuntu/LMDE и в /var/log/cron в Redhat/Rocky Linux. Вы можете отфильтровать файл журнала с помощью команды grep, чтобы проверить, успешно ли выполнено задание cron или нет.

grep "cron" /var/log/syslog | tail

Установка

Если cron не установлен на вашей системе, вы можете установить его:

# Debian/Ubuntu/LMDE
sudo apt update
sudo apt install cron
sudo systemctl enable cron

Проверка статуса Cron:

sudo service cron status
# или
sudo systemctl status cron
# sudo systemctl status cron.service
# или
sudo /etc/init.d/crond status

Команды управления Cron:

# Запустить
sudo service cron start

# Перезапустить (остановка и запуск)
sudo service cron restart

# Перечитать конфигурацию (без полного перезапуска)
sudo service cron reload

# Остановить
sudo service cron stop

Параметры Crontab

crontab -e Редактирование или создание файла расписания для текущего пользователя
crontab -l Вывод содержимого расписания текущего пользователя
crontab -r Удаление файла расписания текущего пользователя
crontab -i Удаление файла расписания текущего пользователя с запросом перед удалением
crontab -u user Работа с расписаниями конкретных пользователей. Доступно только суперпользователю

Синтаксис Crontab и операторы

Каждая запись в crontab состоит из шести полей, указываемых в следующем порядке:

minute(s) hour(s) day(s) month(s) weekday(s) command(s)

# Пользователя может не указываться
[минута] [час] [день месяца] [месяц] [день недели] [пользователь] [команда]
* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)

Поля разделяются пробелами или знаками табуляции. Первые пять представляют собой числовые значения, а шестое - это команда, которая будет выполняться. В следующей таблице кратко описывается каждое из полей:

Поле Диапазон значений Описание
minute 0-59 Минута запуска команды
hour 0-23 Час запуска
day 1-31 Число (день) запуска
month 1-12 Месяц запуска
weekday 0 - 6 День недели запуска (воскресенье = 0, понедельник = 1, вторник = 2 и т.д.)
command Последовательность команд для выполнения. Это могут быть команды, исполняемые файлы (например, скрипты) или комбинации файлов.
Значение первых пяти полей может быть либо * (звездочкой), что означает все допустимые значения, либо списком элементов, разделенных запятыми. Элемент является либо числовым, либо диапазоном чисел, обозначенным двумя значениями, разделенными тире (например, 10-12).
  • * - оператор звездочки означает любое значение или всегда. Если в поле "Час" имеется символ звездочки, это означает, что задание будет выполняться каждый час.
  • , - оператор запятой позволяет указать список значений для повторения. Например, если у вас есть 1,3,5 в поле "Час", задание будет выполняться в 1, 3 и 5 часов утра.
  • - - оператор дефиса позволяет указать диапазон значений. Если в поле "День недели" указано значение 1–5, задание будет выполняться каждый рабочий день (с понедельника по пятницу).
  • / - оператор косой черты позволяет указать значения, которые будут повторяться в течение определенного интервала между ними. Например, если в поле "Час" указано */4, это означает, что действие будет выполняться каждые четыре часа. Это то же самое, что указание 0,4,8,12,16,20. Вместо звездочки перед оператором косой черты можно также использовать диапазон значений, 1-30/10 означает то же, что и 1,11,21

Формат описания диапазонов числовых значений

Диапазоны числовых значений могут задаваться в следующем формате:

Объявление Значение
* Любое числовое значение
*/5 Любое числовое значение, кратное 5
1-6 Любое числовое значение из диапазона от 1 до 6 (включительно)
0-30/5 Любое числовое значение из диапазона от 0 до 30, кратное 5
1,4,9 Значение 1, 4 или 9

Формат описания месяцев

Месяцы могут описываться как с помощью числовых, так и с помощью строковых значений:

Числовое значение Строковое значение Месяц
1 jan Январь
2 feb Февраль
3 mar Март
4 apr Апрель
5 may Май
6 jun Июнь
7 jul Июль
8 aug Август
9 sep Сентябрь
10 oct Октябрь
11 nov Ноябрь
12 dec Декабрь

Формат описания дней недели

Дни недели также могут описываться также как с помощью числовых, так и с помощью строковых значений:

Числовое значение Строковое значение День недели
0 Sunday Воскресенье
1 Monday Понедельник
2 Tuesday Вторник
3 Wednesday Среда
4 Thursday Четверг
5 Friday Пятница
6 Saturday Суббота

Переменные Crontab

Демон cron автоматически устанавливает несколько переменных окружения.

  • Путь по умолчанию установлен в PATH=/usr/bin:/bin. Если вызываемая вами команда присутствует в указанном пути cron, вы можете использовать абсолютный путь к команде или изменить переменную cron $PATH.
  • Оболочка по умолчанию установлена в /bin/sh. Вы можете установить другую оболочку, изменив переменную SHELL
  • Cron вызывает команду из домашнего каталога пользователя. Переменная HOME может быть переопределена настройками в crontab.
  • Уведомление по электронной почте отправляется владельцу crontab. Чтобы перезаписать поведение по умолчанию, вы можете использовать переменную среды MAILTO со списком (через запятую) всех адресов электронной почты. Если MAILTO определено, но пусто (MAILTO = ""), письмо не отправляется.

Предопределённые макросы (константы)

Существует несколько специальных макросов (констант) расписания Cron, используемых для определения общих интервалов. Можно использовать эти ярлыки вместо указания даты в пять столбцов.

  • @yearly - (или @annually) - запускать задание один раз в год в полночь (12:00) 1 января. Эквивалент 0 0 1 1 *
  • @monthly - запускать задание один раз в месяц в полночь первого дня месяца. Эквивалент 0 0 1 * *
  • @weekly - запускать задание раз в неделю в полночь воскресенья. Эквивалент 0 0 * * 0
  • @daily - запускать задание один раз в день в полночь. Эквивалент 0 0 * * *
  • @hourly - запускать задание один раз в час в начале часа. Эквивалент 0 * * * *
  • @reboot - запускать задание при запуске системы (время загрузки)

Выполнение PHP скриптов

Для выполнения php скриптов из cron необходим бинарный интерпретатора PHP.
# Запуск скрипта в 5 утра каждый день:
0 5 * * * /usr/bin/php -q /home/www/html/script.php

Опция -q указывает PHP не выдавать HTTP-заголовки.

Настройка времени запуска

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

* * * * * Каждую минуту
* 0 * * * Каждую минуту, между 00:00 и 00:59
5,15,30 * * * * В 5,15,30 минут каждого часа каждый день
*/5 * * * * Каждые 5 минут
*/30 * * * * Каждые 30 минут (пол часа)
0 * * * * или @hourly Каждый час 👉 Запуск задания Cron каждый час
0 */3 * * * Каждые 3 часа
15 * * * * Каждый час в 15 минут
0 * * * 1-5 Каждый час по рабочим дням (пн - пт)
* */2 * * * Каждый четный час
*/30 * * * 1-5 Каждые пол часа по рабочим дням (пн - пт)
30 6 * * * Каждый день в 06:30
30 6,8,10,12 * * * Каждый день в 06:30,08:30,10:30,12:30
0 10,12 * * 1,3 В понедельник и среду в 10:00 и 12:00
0 10,12 * * 1-3 С понедельника по среду в 10:00 и 12:00
0 0 * * 1-5 В полночь с понедельника по пятницу
0 1 * * 7 В час ночи (01:00) с субботы на воскресенье
0 0 * * 1 Каждый понедельник:
0 1 * * sat Каждую субботу в 1 час ночи
0 9,18 * * 1 Каждый понедельник в 9:00 и 18:00
0 12 1 * * Каждый месяц 1 числа в 12:00
15 9 1,15 * * В 21:15, 1 и 15 числа каждого месяца
0 8 * * 3,6 В 8:00 по средам и субботам
0 7 1 * * 1 числа каждого месяца в 7-00
0 12 * * 1 В 12-00 по понедельникам
0 10,11 * * * В 10:00 и 11:00 ежедневно
0 6-18/30 * * * Каждые пол часа с 6:00 до 18:00
15 9-19/2 * * * Каждые 2 часа с 9:15 до 19-15
20 8-18/1 * * * Каждый час с 8-20 до 18-20
10,40 10-16 * * * В 10 и 40 минут с 10:00 до 16:00
15 7-23 * * * С 7:15 до 23:15 в 15 минут каждого часа
20 4-18/2 * * * С 4-20 до 18-20 в 20 минут каждые 2 часа
*/10 5-22 * * * С 5:00 до 22:00 каждые 10 минут
59 23 31 dec * Новый год

Онлайн редакторы Cron заданий

Онлайн сервисы (редакторы) по подбору синтаксиса для выполнения задания CRON в нужное время: