Для запуска задач по расписанию в 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 – время выполнения в формате: минута час деньмесяца месяц деньнедели. Любое поле может быть записано следующим образом:
Месяц и день_недели задаются номером или первыми тремя буквами названия.
Переменные окружения, которые влияют на выполнение команды:
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
Для однократного запуска команды в указанное время используется демон 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 изначально придуман для персональных компьютеров, которые могут быть выключены в тот момент, когда 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
/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
/etc/crontab в CentOS 6 пуст
/etc/cron.d/0hourly:
01 * * * * root run-parts /etc/cron.hourly
/etc/cron.hourly/0anacron вызывает anacron, который и выполняет запуск ежедневных, еженедельных и ежемесячных задач.