Запуск задач по расписанию - crond

Для запуска задач по расписанию в Unix традиционно используется демон crond. Эта программа при старте читает пользовательские файлы расписаний из каталога /var/spool/cron/ и общесистемное расписание, хранящееся в файле /etc/crontab и файлах, расположенных в каталоге /etc/cron.d/. Общесистемное расписание отличается от пользовательского тем, что каждая его запись содержит поле с идентификатором пользователя, от имени которого выполняется задание.

После того, как расписания загружены в оперативную память, crond ежеминутно проверяет наличие записи в расписании, соответствующей текущему времени, и, если такая найдена, запускает указанную команду от имени указанного пользователя. Вывод команды (stdout и stderr) перехватывается и отправляется по почте, указанной в расписании. По умолчанию почта при выполнении пользовательского расписания отправляется локальному пользователю, а при выполнении общесистемного расписания – root'у.

Если crond обнаруживает изменение времени mtime у файла /etc/crontab или у одного из каталогов с расписаниями, то он автоматически заново считывает все файлы расписаний.

Формат расписания

Формат общесистемного расписания

# Установка переменных окружения
name = value
#строка расписания
mm hh DD MM DW user cmd [arg...]

Формат пользовательского расписания

# отличается отсутствием поля user
mm hh DD MM DW  cmd [arg...]

mm hh DD MM DW – время выполнения в формате: минута час деньмесяца месяц деньнедели. Любое поле может быть записано следующим образом:

  • * – любое значение
  • 1-7 – интервал значений от и до
  • 0-10,20,30,40,50 – перечисление значений и интервалов
  • */10 – итерация с шагом, т.е. 0,10,20...
  • 0-10/2 – в промежутке с шагом

Месяц и день_недели задаются номером или первыми тремя буквами названия.

Переменные окружения, которые влияют на выполнение команды:

  • LOGNAME – имя пользователя (изменить нельзя)
  • HOME – домашний каталог, в котором будет запущена программа (по умолчанию из /etc/passwd)
  • SHELL – командный интерпретатор, которому будет передана на выполнение команда (по умолчанию из /etc/passwd)
  • MAILTO – почтовый адрес для отправки результата выполнения (по умолчанию локальному пользователю)

Редактирование личного расписания

crontab file – скопировать личное расписание из файла
crontab -e – запуск редактора vi для правки расписания
crontab -l – просмотреть расписание
crontab -r – удалить расписание

Пример личного расписания

   # некоторые любят интерпретатор zsh 
   SHELL=/bin/zsh
   # Отсылаем почту на внешний адрес
   MAILTO= test@example.com
   #
   # каждый день в ноль часов пять минут
   # перехватываем вывод, чтобы не приходили письма
   5 0 * * *       $HOME/bin/daily.job >> /dev/null 2>&1
   # В 14:15 первого числа каждого месяца
   15 14 1 * *     $HOME/bin/monthly
   # раз в пять минут проверяем почту
   */5 * * * *    $HOME/bin/check_mail

Одноразовое выполнение действий по расписанию – at

Для однократного запуска команды в указанное время используется демон atd, задания для которого формируются командой at. Команда вводится со стандартного ввода или читается из файла. Время задаётся в различных форматах, например 16:00 31.12.2014 или "now +3 hours" (minutes, hours, days)

echo touch /tmp/test | at 14:35 – создать файл сегодня в 14:35, а если уже поздно, то завтра в указанное время
at -f file now + 14days – прочитать команду из файла и выполнить через две недели
atq – показать все назначенные задания
atrm id – удалить задание с номером id

Сервис anacron

Сервис anacron изначально придуман для персональных компьютеров, которые могут быть выключены в тот момент, когда crond должен был запустить очередную команду. Если anacron обнаруживает, что ежедневная, еженедельная или ежемесячная команда не была выполнена, то он осуществляет её запуск. Конфигурация anacron хранится в /etc/anacrontab в формате:

period delay job-identifier command

где
period – периодичность выполнения команды в днях
delay – если за указанный период команда не выполнялась, то делается задержка delay минут и запускается команда
job-identifier – произвольная текстовая строка для записи в лог-файлы
command – выполняемая команда

Типичный файл /etc/anacrontab (run-parts – выполнить все файлы в каталоге):

 #period in days   delay in minutes   job-identifier   command
 1                                5       cron.daily   nice run-parts /etc/cron.daily
 7                               25      cron.weekly   nice run-parts /etc/cron.weekly
 @monthly                        45     cron.monthly   nice run-parts /etc/cron.monthly

В результате переноса долгопериодных действий в anacron, в CentOS 6 существенно изменилось содержание /etc/crontab

CentOS 5

/etc/crontab:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

CentOS 6

/etc/crontab в CentOS 6 пуст

/etc/cron.d/0hourly:

01 * * * * root run-parts /etc/cron.hourly

/etc/cron.hourly/0anacron вызывает anacron, который и выполняет запуск ежедневных, еженедельных и ежемесячных задач.