Использование 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
Все вместе выглядят следующим образом:
минуты часы день_месяца месяц день_недели команда
Также существует несколько специальных символов, которые вы можете включить в компонент расписания выражения cron, что упрощает создание расписания:
*
в выражениях cron звездочка служит подстановочным символом, который представляет все значения. Таким образом, задача, запланированная в форме* * * * *
, будет запускаться каждую минуту, каждый час, каждый день каждого месяца,
запятые разбивают значения расписания для получения списка. Если вы хотите запускать задачу в начале и середине каждого часа, а не выполнять две отдельные задачи0 * * * *
и30 * * * *
, вы можете добиться той же функциональности с помощью одного выражения0,30 * * * *
-
дефис представляет диапазон значений в поле расписания. Вместо создания 30 отдельных запланированных задач для команды, которую вы хотите запускать первые 30 минут каждого часа0 * * * *
,1 * * * *
,2 * * * *
и т.д., вы можете просто запланировать его следующим образом:0-29 * * * *
/
вы можете использовать косую черту со звездочкой для выражения значения шага. Например, вместо написания восьми отдельных задач cron для запуска команды каждые три часа0 0 * * *
,0 3 * * *
,0 6 * * *
и т.д., вы можете задать расписание для запуска следующим образом:0 */3 * * *
Нам нужно запускать от имени суперпользователя наш скрипт по адресу /usr/local/bin/serve
. Самый простой пример, запускать его каждую минуту:
* * * * * /usr/local/bin/serve
Будем запускать наш скрипт, каждый час в нулевую минуту:
0 * * * * /usr/local/bin/serve
Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 ночи:
0 0 * * * /usr/local/bin/serve
Если идти так дальше, то можно запускать в первый день каждого месяца:
0 0 1 * * /usr/local/bin/serve
В любой день, 15 числа:
0 0 15 * * /usr/local/bin/serve
В первый день недели первого месяца года, 0 часов 0 минут:
0 0 * 1 0 /usr/local/bin/serve
Или в нулевой день недели каждого месяца:
0 0 * * 0 /usr/local/bin/serve
Можно выбрать любую минуту, час, день недели, например, 15.30 во вторник:
30 15 * * 2 /usr/local/bin/serve
Понедельник считается первым днем, воскресенье - это седьмой или нулевой день. Еще можно писать сокращенное название дня недели, например sun - воскресенье:
30 15 * * sun /usr/local/bin/serve
Для того чтобы указать определенный интервал нужно использовать символ -
, например, каждый час, с семи утра до семи вечера:
0 7-19 * * * /usr/local/bin/serve
Если нужно запустить команду несколько раз, можно использовать разделитель ,
. Запустим скрипт в 5 и 35 минут пятого (16:05 и 16:35), каждый день:
5,35 16 * * * /usr/local/bin/serve
Вы можете захотеть не указывать отдельно время, а просто указать интервал, с которым нужно запускать скрипт, например, раз в 10 минут. Для этого используется разделитель косая черта /
:
*/10 * * * * /usr/local/bin/serve
Кроме того, для некоторых часто используемых наборов были придуманы переменные:
@reboot
при загрузке, только один раз@yearly, @annually
раз год@monthly
раз в месяц@weekly
раз в неделю@daily, @midnight
каждый день@hourly
каждый час
Вот так просто будет выглядеть команда запуска скрипта раз в час:
@hourly /usr/local/bin/serve
Если собрались добавить скрипт для инициализации в cron, нужно чтобы его имя было без точек и у него были права на выполнение.
Отладка работы
После того как вы настроили правила, нужно проверить работают ли они. Для этого ждем время, когда скрипт уже должен быть выполнен и смотрим лог cron. Иногда он находится в /var/log/cron
, а иногда пишется в syslog
. У меня в crontab есть такая строка:
* * * * * /usr/local/bin/serve
Смотрим лог:
nano /var/log/cron
И видим что в нашем логе она действительно есть и выполняется целиком успешно. Если бы были какие-либо ошибки, то тут было бы выведено сообщение: