9.7. Планирование задач с помощью cron
и atd
cron
— это демон, отвечающий за запуск запланированных и повторяющихся команд (каждый день, каждую неделю и т. д.); atd
— демон, работающий с командами ,которые должны запускаться однократно, но в конкретный момент времени в будущем.
В системе Unix многие задачи планируются для регулярного запуска:
По умолчанию все пользователи могут планировать запуск задач. У каждого пользователя есть свой собственный crontab, в который он может записывать запланированные команды. Его можно отредактировать, запустив crontab -e
(его содержимое хранится в файле /var/spool/cron/crontabs/пользователь
).
У пользователя root есть свой собственный crontab, но он также может использовать файл /etc/crontab
или создавать дополнительные файлы crontab в каталоге /etc/cron.d
. У последних двух решений есть то преимущество, что можно указать пользователя, от имени которого запускается команда.
Пакет cron по умолчанию содержит некоторые запланированные задачи, которые выполняются:
программы из каталога /etc/cron.hourly/
— каждый час;
программы из каталога /etc/cron.daily/
— каждый день;
программы из каталога /etc/cron.weekly/
— каждую неделю;
программы из каталога /etc/cron.monthly/
— раз в месяц.
Многие пакеты Debian зависят от этого сервиса: помещая сценарии обслуживания в эти каталоги, они обеспечивают оптимальную работу своих сервисов.
9.7.1. Формат файла crontab
Каждая значащая строка crontab описывает запланированную команду в следующих шести (или семи) полях:
значение минуты (число от 0 до 59);
значение часа (от 0 до 23);
значение числа месяца (от 1 до 31);
значение месяца (от 1 до 12);
значение дня недели (от 0 до 7, где 1 соответствует понедельнику, а воскресенье может быть представлено как 0 или 7; также можно использовать первые три буквы англоязычного названия дня недели, например Sun
, Mon
и т. д.);
имя пользователя, от имени которого должна выполняться команда (в файле /etc/crontab
и в фрагментах, расположенных в /etc/cron.d/
, но не в пользовательских файлах crontab);
команда, которая должна быть запущена (при выполнении условий, определённых в первых пяти колонках).
Все эти подробности описаны на странице man crontab(5).
Каждое значение может быть представлено в виде списка возможных значений (разделённого запятыми). Синтаксис a-b
описывает интервал всех значений между a
и b
. Синтаксис a-b/c
описывает интервал с промежутками c
(пример: 0-10/2
означает 0,2,4,6,8,10
). Звёздочка *
является шаблоном, означающим все допустимые значения.
Пример 9.2. Пример файла crontab
#Format
#min hour day mon dow command
# Download data every night at 7:25 pm
25 19 * * * $HOME/bin/get.pl
# 8:00 am, on weekdays (Monday through Friday)
00 08 * * 1-5 $HOME/bin/dosomething
# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy
9.7.2. Использование команды at
С помощью команды at
осуществляется планирование какой-либо задачи в тот или иной момент в будущем. Команда принимает в качестве параметра командной строки время и дату, и её выполнение произойдёт в стандартном выводе. Команда будет выполнена таким образом, как будто она была выполнена в настоящей оболочке (shell). at
даже возьмёт на себя заботу получить информацию о ваших переменных настоящего окружающего рабочего стола (environment) для того, чтобы в будущем, при выполнении задания, постараться воспроизвести хотя бы часть сегодняшних условий. Отображение времени следует обычным соглашениям: 16:12
или 4:12pm
соответствует 4:12 часа пополỳдня или 16 часов 12 минут. Дата может быть указана в нескольких европейских или западных форматах, включающих DD.MM.YY
(значение 27.07.15
таким образом соответствует 27 июля 2015), YYYY-MM-DD
(похожая дата будет выглядеть как 2015-07-27
), MM/DD/[CC]YY
(например, 12/25/15
или 12/25/2015
будут означать - Декабрь 25, 2015), или просто MMDD[CC]YY
(то есть значения 122515
или 12252015
будут, подобным образом, представлять Декабрь 25, 2015). Без этого, то есть без указания даты, команда будет выполнена в назначенное время, как только отсчёт времени достигнет его (в тот же день, или завтра, если указанное время сегодня уже было пропущено). Вы можете также просто написать “today” - сегодня или “tomorrow” - завтра, каждое из этих слов говорит само за себя.
$
at 09:00 27.07.15 <<END
>
echo "Don't forget to wish a Happy Birthday to Raphaël!" \
>
| mail lolando@debian.org
>
END
warning: commands will be executed using /bin/sh
job 31 at Mon Jul 27 09:00:00 2015
Альтернативный синтаксис откладывает запуск на заданный промежуток времени: at now + число период
. Значение период может быть minutes
, hours
, days
или weeks
. Значение число указывает число указанных единиц, которое должно пройти перед запуском программы.
Для отмены задачи, запланированной cron
, нужно просто запустить crontab -e
и удалить соответствующую строку в файле crontab. Для задач at
это почти так же легко: надо запустить atrm номер-задачи
. Номер задачи указывается командой at
при её планировании, а также её можно найти с помощью команды atq
, выводящей текущий список запланированных задач.