cron - демон, предназначенный для выполнения команд по расписанию. Планирование заключается в формаровании специальных текстовых файлов, содержащих инструкции для cron.
Можно предположить, что неоднократно уличенные в любви к греческой мифологии разработчики unix неслучайно выбрали такое имя. Примерно так греки называли бога, олицетворявшего представление о времени. Так как unix-way предполагает краткость везде, где только можно, имя бога урезали: с "Cronus" (англоязычного написания) до "Cron", сделав его при этом абсолютно идентичным русскому "Крон".
Утилита cron использует файлы, названные идентично именам пользователей из /etc/passwd, и лежащие в /var/cron/tabs, для выполнения команд этих пользователей. Демон сам загружает их в оперативную память вместе с главным файлом /etc/crontab, имеющим несколько другой формат.
К примеру, на нашем хостинге утилита cron использует файлы с именами вида host12345, для планирования каких-либо действий пользователя host12345.
Cron постоянно запущен в фоновом режиме, каждую минуту демон проверяет, нужно ли выполнять какое-либо действие в соответствии с файлами конфигурации. Также проверяется, не было ли изменений в файлах конфигурации. Если файлы менялись, cron заново загружает обновленные файлы, гарантируя таким образом почти мгновенное принятие любых изменений и добавлений в свои файлы.
Есть некоторая разница в механизме исполнения команд из файла /etc/crontab и личных файлов пользователей /var/cron/tabs, которая заключается в проверке статуса пользователя. Для файлов /var/cron/tabs такая проверка выполняется для владельца аккаунта (с помощью модуля pam), для файла /etc/crontab - нет; команды из этого файла выполняются безусловно.
В утилите cron предусмотрена также отправка почтового сообщения, содержащего вывод выполненной команды, владельцу файла. Есть, впрочем, возможность указать любой другой имейл с помощью переменной окружения MAILTO.
Для редактирования файла crontab вашего пользователя используется команда:
crontab -e
Таблица crontab состоит из 6 колонок, разделяемых пробелами или табуляторами. Первые пять колонок задают время выполнения (Минута, Час, День, Месяц, День недели), в них может находиться число, список чисел, разделённых запятыми, диапазон чисел, разделённых тире, или символ '*'. Все остальные символы в строке интерпретируются как выполняемая команда с её параметрами. Если команда отправляет какой-нибудь текст в стандартный вывод, этот текст отправляется по e-mail пользователю.
* * * * * выполняемая команда - - - - - | | | | | | | | | ----- День недели (0 - 7) (Воскресенье =0 или =7) | | | ------- Месяц (1 - 12) | | --------- День (1 - 31) | ----------- Час (0 - 23) ------------- Минута (0 - 59)
Пример файла crontab:
# как обычно, с символа '#' начинаются комментарии #### Здесь начинаются задания # выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily 5 0 * * * host123456789 $HOME/bin/daily.job >> $HOME/log/daily 2>&1 # выполнять 1 числа каждого месяца в 14 часов 15 минут 15 14 1 * * $HOME/bin/monthly # каждый рабочий день в 22:00 0 22 * * 1-5 echo "Пора домой" | mail -s "Уже 22:00" john 23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д." 5 4 * * sun echo "Выполняется в 4:05 в воскресенье" 0 0 1 1 * echo "С новым годом!" 15 10,13 * * 1,4 echo "Эта надпись выводится в понедельник и четверг в 10:15 и 13:15" 0-59 * * * * echo "Выполняется ежеминутно" # каждые 5 минут */5 * * * * echo "Прошло пять минут"
Как создать и отредактировать свой конфигурационный файл?
Редактировать конфигурационный файл можно двумя способами.
Способ первый – прямое редактирование через crontab.
У этого способа есть один недостаток – редактор vi, в котором открывается файл, довольно сложен в использовании и требует определенного опыта и навыков.
Чтобы сменить редактор на более удобный, перед редактированием конфигурационного файла cron Вы можете добавить строку export EDITOR=mcedit
в файл /home/login/.bash_profile, отредактировав файл с помощью команды mcedit ~/.bash_profile
.
Способ второй – приказ демону cron перечитать готовый файл. Этот способ проще в использовании.
Имейте в виду, для того, чтобы любое изменение конфигурационного файла вступило в силу, необходимо снова выполнить команду crontab имя_файла. При этом все предыдущие настройки crontab будут перезаписаны новыми. Кроме того, не следует путать конфигурационный файл crontab с тем файлом, который создаете Вы сами. Команда crontab имя_файла копирует содержимое Вашего файла в специальный файл crontab, после этого Ваш файл в процессе больше не участвует.
Что нужно писать в конфигурационном файле?
Конфигурационный файл состоит из строк, каждая из которых описывает программу, которая будет запускаться по расписанию. Каждая строка состоит из 6 полей, поля отделяются друг от друга пробелом или табуляцией. Поля имеют следующее назначение:
Каждое из первых 5 полей может быть записано несколькими способами:
Кроме того, Вы можете получать по почте результаты и ошибки выполнения программ, запускаемых демоном cron по расписанию. Для этого в конфигурационном файле напишите MAILTO=ваш_email_адрес.
Где я могу получить дополнительную информацию?
Для получения дополнительной информации по этой теме можно воспользоваться встроенной справочной системой, набрав в командной строке сервера:
man cron – описание особенностей функционирования cron
man 1 crontab – описание способов использования crontab
man 5 crontab – описание формата конфигурационных файлов для cron
Как запускать php скрипт из cron’a?
Строка в кронфайле, запускающая php скрипт выглядит так:
* * * * * /usr/local/bin/php /home/user/www/site1/public_html/script.php
где /usr/local/bin/php – путь до php-интерпретатора (на различных серверах путь может быть разным. Выяснить путь можно с помощью команды which php);
/home/user/www/site1/public_html/script.php – путь до скрипта необходимо указывать от корня сервера.
Мой php скрипт требует параметров в адресной строке, как можно вызвать такой скрипт?
Для запуска php-скриптов методом GET из cron`a используют утилиту wget. Строка записи cron-файла выглядит так:
* * * * * /usr/local/bin/wget 'http://имя_домена/script.php?var1=xxx&var2=yyy'
Где /usr/local/bin/wget – путь до утилиты wget;
http://имя_домена/script.php?var1=xxx&var2=yyy – ссылка на скрипт.
В случае, если Вы не хотите, чтобы полученный от скрипта вывод сохранялся в файле, можно использовать вместо wget программу GET.
Как запустить perl скрипт из cron’a?
Для запуска perl-скриптов указывать путь до интерпретатора не нужно, так как путь уже указан в заголовке самого скрипта.
Если что-то не получается, всегда можно спросить у нас.