Использование Cron
Для работы с планировщиком в системе есть ряд команд, помогающих решать основные задачи.
Открыть конфигурационный файл если он есть, создать конфигурационный файл если его нет:
crontab -e
Показывает список задач из конфигурационного файла:
crontab -l
Удалить конфигурационный файл вместе со всеми запланированными задачами:
crontab -r
Посмотреть, когда в последний раз открывался конфигурационный файл:
сrontab -v
Первичная настройка
Планировщик черпает параметры для выполнения своих задач из crontab-файлов (таблиц с расписанием). У каждого пользователя, включая root, должен быть свой crontab-файл. По умолчанию он не существуют, поэтому придется создать его вручную. Для этого существует команда, которая автоматически генерирует таблицу в директории /var/spool/cron
:
crontab -e
Вновь созданный файл будет пустым текстовым полем. Необходимо добавлять в него все параметры самостоятельно с нуля, опираясь на синтаксис. Если нужно открыть файл в любимом редакторе, нужно воспользоваться командой:
EDITOR=nano crontab -e
Либо поменять редактор по умолчанию в операционной системе:
export EDITOR=nano
Ограничения
У Cron есть функция установки ограничений на использование, задающихся через два специальных файла:
cron.allow
cron.deny
Первый файл находится в директории /usr/lib/cron/cron.allow
и содержит в себе список учетных записей, которые имеют право на планирование задач с помощью встроенных системных утилит.
Второй файл находится в директории /usr/lib/cron/cron.deny
. В нем указываются имена пользователей, которые не могут запускать встроенный в систему планировщик задач.
Если первого файла не существует, то любой пользователь может планировать задачи с помощью встроенного в систему планировщика, но только при условии, что его имени нет во втором файле. Если удалить оба файла, то каждый пользователь сможет планировать задачи без ограничений.
Синтаксис
Задачи в cron записываются и управляются в специальном файле crontab
. Каждый профиль пользователя в системе может иметь собственный файл crontab
, где составляются расписания задач, которые хранятся в /var/spool/cron/
Чтобы запланировать задачу, вам нужно открыть ваш файл crontab
для редактирования и добавления задачи, написанной в форме выражения cron
.
Синтаксис выражений cron можно разбить на два элемента:
минута час день месяц день_недели пользователь /путь/к/исполняемому/файлу
Команда может быть любой, которую тоько можно запустить в командной строке. Расписание в синтаксисе разбито на 5 разных полей, которые расположены в следующем порядке:
минуты
0-59часы
0-23день месяца
1-31месяц
1-12день недели
0-6
Все вместе выглядят следующим образом:
SHELL=/bin/bash
MAILTO=info@hmarketing.ru
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# Детали смотрите в следующих разделах
# Примеры оформления задач в планировщике (формат данных):
# .---------------- минуты (0 - 59)
# | .------------- часы (0 - 23)
# | | .---------- дни месяца (1 - 31)
# | | | .------- сами месяцы (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- дни недели (0 - 6) (0 или 7 это воскресенье в зависимости от настроек системы) можно использовать сокращения типа mon,tue,wed,thu,fri,sat,sun
# | | | | |
# * * * * * имя пользоваться, команда которую нужно запустить
Также существует несколько специальных символов, которые вы можете включить в компонент расписания выражения cron, что упрощает создание расписания:
*
в выражениях cron звездочка служит подстановочным символом, который представляет все значения. Таким образом, задача, запланированная в форме* * * * *
, будет запускаться каждую минуту, каждый час, каждый день каждого месяца,
запятые разбивают значения расписания для получения списка. Если вы хотите запускать задачу в начале и середине каждого часа, а не выполнять две отдельные задачи0 * * * *
и30 * * * *
, вы можете добиться той же функциональности с помощью одного выражения0,30 * * * *
-
дефис представляет диапазон значений в поле расписания. Вместо создания 30 отдельных запланированных задач для команды, которую вы хотите запускать первые 30 минут каждого часа0 * * * *
,1 * * * *
,2 * * * *
и т.д., вы можете просто запланировать его следующим образом:0-29 * * * *
/
вы можете использовать косую черту со звездочкой для выражения значения шага. Например, вместо написания восьми отдельных задач cron для запуска команды каждые три часа0 0 * * *
,0 3 * * *
,0 6 * * *
и т.д., вы можете задать расписание для запуска следующим образом:0 */3 * * *
Нам нужно запускать наш скрипт в оболочке /bin/bash
по адресу /usr/local/bin/serve.sh
. Самый простой пример, запускать его каждую минуту:
* * * * * /bin/bash /usr/local/bin/serve.sh
Будем запускать наш скрипт, каждый час в нулевую минуту:
0 * * * * /bin/bash /usr/local/bin/serve.sh
Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:
0 0 * * * /bin/bash /usr/local/bin/serve.sh
Если идти так дальше, то можно запускать в первый день каждого месяца:
0 0 1 * * /bin/bash /usr/local/bin/serve.sh
В любой день, 15 числа:
0 0 15 * * /bin/bash /usr/local/bin/serve.sh
В первый день недели первого месяца года, 0 часов 0 минут:
0 0 * 1 0 /bin/bash /usr/local/bin/serve.sh
Или в нулевой день недели каждого месяца:
0 0 * * 0 /bin/bash /usr/local/bin/serve.sh
Можно выбрать любую минуту, час, день недели, например, 15.30 во вторник:
30 15 * * 2 /bin/bash /usr/local/bin/serve.sh
Понедельник считается первым днем, воскресенье - это седьмой или нулевой день. Еще можно писать сокращенное название дня недели, например sun - воскресенье:
30 15 * * sun /bin/bash /usr/local/bin/serve.sh
Для того чтобы указать определенный интервал нужно использовать символ -
, например, каждый час, с семи утра до семи вечера:
0 7-19 * * * /bin/bash /usr/local/bin/serve.sh
Если нужно запустить команду несколько раз, можно использовать разделитель ,
. Запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:
5,35 16 * * * /bin/bash /usr/local/bin/serve.sh
Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта /
:
*/10 * * * * /bin/bash /usr/local/bin/serve.sh
Кроме того, для некоторых часто используемых наборов были придуманы переменные:
@reboot
при загрузке, только один раз@yearly, @annually
раз год@monthly
раз в месяц@weekly
раз в неделю@daily, @midnight
каждый день@hourly
каждый час
Вот так просто будет выглядеть команда запуска скрипта раз в час:
@hourly /bin/bash /usr/local/bin/serve.sh
Если собрались добавить скрипт для инициализации в cron, нужно чтобы его имя было без точек и у него были права на выполнение.
Отладка работы
После того как вы настроили правила, нужно проверить работают ли они. Для этого ждем время, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron
, а иногда пишется в syslog
. У меня в crontab есть такая строка:
* * * * * /bin/bash /usr/local/bin/serve.sh
Смотрим лог:
nano /var/log/cron
И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут было бы выведено сообщение:

Уведомления на почту
Если вы хотите получать уведомления о работе скрипта не на тот электронный адрес, который указан в вашем профиле, модифицируйте файл crontab. В нём укажите почту, на которую планировщик должен направить результаты. Обратите внимание, что для корректной отправки результатов на вашем сервере должен быть установлен и настроен почтовый агент.
Адрес электронной почты задаётся в начале файла crontab c помощью оператора MAILTO
:
MAILTO=info@hmarketing.ru
Уведомления в журнал
Хорошим тоном считается сохранять результаты работы фоновых скриптов в журнал. Такой вариант особенно хорошо подходит для задач, которые выполняются часто. В случае неудачного выполнения задачи отчёт рискует потеряться в почте, а лог-файл всегда можно разобрать, найти ошибки и поправить скрипт.
С помощью оператора >
нужно направить вывод в файл журнала, в том числе ошибки, окажется в лог-файле.
10 21 * * * /bin/bash /usr/local/bin/serve.sh > /home/backup/cron-rm-cache.log