Полный цикл в digital

Использование 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 есть функция установки ограничений на использование, задающихся через два специальных файла:

  1. cron.allow
  2. cron.deny

Первый файл находится в директории /usr/lib/cron/cron.allow и содержит в себе список учетных записей, которые имеют право на планирование задач с помощью встроенных системных утилит.

Второй файл находится в директории /usr/lib/cron/cron.deny. В нем указываются имена пользователей, которые не могут запускать встроенный в систему планировщик задач.

Если первого файла не существует, то любой пользователь может планировать задачи с помощью встроенного в систему планировщика, но только при условии, что его имени нет во втором файле. Если удалить оба файла, то каждый пользователь сможет планировать задачи без ограничений.

Синтаксис

Задачи в cron записываются и управляются в специальном файле crontab. Каждый профиль пользователя в системе может иметь собственный файл crontab, где составляются расписания задач, которые хранятся в /var/spool/cron/

Чтобы запланировать задачу, вам нужно открыть ваш файл crontab для редактирования и добавления задачи, написанной в форме выражения cron.

Синтаксис выражений cron можно разбить на два элемента:

минута час день месяц день_недели пользователь /путь/к/исполняемому/файлу

Команда может быть любой, которую тоько можно запустить в командной строке. Расписание в синтаксисе разбито на 5 разных полей, которые расположены в следующем порядке:

  1. минуты 0-59
  2. часы 0-23
  3. день месяца 1-31
  4. месяц 1-12
  5. день недели 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, что упрощает создание расписания:

  1. * в выражениях cron звездочка служит подстановочным символом, который представляет все значения. Таким образом, задача, запланированная в форме * * * * *, будет запускаться каждую минуту, каждый час, каждый день каждого месяца
  2. , запятые разбивают значения расписания для получения списка. Если вы хотите запускать задачу в начале и середине каждого часа, а не выполнять две отдельные задачи 0 * * * * и 30 * * * *, вы можете добиться той же функциональности с помощью одного выражения 0,30 * * * *
  3. - дефис представляет диапазон значений в поле расписания. Вместо создания 30 отдельных запланированных задач для команды, которую вы хотите запускать первые 30 минут каждого часа 0 * * * *, 1 * * * *, 2 * * * * и т.д., вы можете просто запланировать его следующим образом: 0-29 * * * *
  4. / вы можете использовать косую черту со звездочкой для выражения значения шага. Например, вместо написания восьми отдельных задач 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

И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут было бы выведено сообщение:

Проверка запуска Cron

Уведомления на почту

Если вы хотите получать уведомления о работе скрипта не на тот электронный адрес, который указан в вашем профиле, модифицируйте файл crontab. В нём укажите почту, на которую планировщик должен направить результаты. Обратите внимание, что для корректной отправки результатов на вашем сервере должен быть установлен и настроен почтовый агент.

Адрес электронной почты задаётся в начале файла crontab c помощью оператора MAILTO:

MAILTO=info@hmarketing.ru

Уведомления в журнал

Хорошим тоном считается сохранять результаты работы фоновых скриптов в журнал. Такой вариант особенно хорошо подходит для задач, которые выполняются часто. В случае неудачного выполнения задачи отчёт рискует потеряться в почте, а лог-файл всегда можно разобрать, найти ошибки и поправить скрипт.

С помощью оператора > нужно направить вывод в файл журнала, в том числе ошибки, окажется в лог-файле.

10 21 * * * /bin/bash /usr/local/bin/serve.sh > /home/backup/cron-rm-cache.log
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг