Справочная информация >> Часто задаваемые вопросы >> Технические вопросы (MySQL, FTP, SSH и т.п.) >> Как использовать cron и все что с ним связано у нас на хостинге


Что такое cron

cron - демон, предназначенный для выполнения команд по расписанию. Планирование заключается в формаровании специальных текстовых файлов, содержащих инструкции для cron.

Можно предположить, что неоднократно уличенные в любви к греческой мифологии разработчики unix неслучайно выбрали такое имя. Примерно так греки называли бога, олицетворявшего представление о времени. Так как unix-way предполагает краткость везде, где только можно, имя бога урезали: с "Cronus" (англоязычного написания) до "Cron", сделав его при этом абсолютно идентичным русскому "Крон".

Как 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.

Использование cron

Для редактирования файла 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.

  • Наберите в командной строке команду crontab -e. Откроется редактор vi с содержимым вашего конфигурационного файла. Если это первый запуск crontab‘а, то файл будет пустой.
  • Отредактируйте содержимое.
  • Выйдите из редактора. Crontab автоматически даст команду демону cron перечитать Ваш файл.

У этого способа есть один недостаток – редактор vi, в котором открывается файл, довольно сложен в использовании и требует определенного опыта и навыков.

Чтобы сменить редактор на более удобный, перед редактированием конфигурационного файла cron Вы можете добавить строку export EDITOR=mcedit в файл /home/login/.bash_profile, отредактировав файл с помощью команды mcedit ~/.bash_profile.

Способ второй – приказ демону cron перечитать готовый файл. Этот способ проще в использовании.

  • Создайте конфигурационный файл на сервере командой touch имя_файла.
  • Отредактируйте его в привычном для Вас редакторе, например в FAR‘е.
  • Если Вам не нравится редактировать файл на сервере, то Вы можете создать и отредактировать файл на своем компьютере и затем закачать его на сервер по FTP. * Выполните команду crontab имя_файла. Crontab при этом даст команду демону cron перечитать Ваш файл.

Имейте в виду, для того, чтобы любое изменение конфигурационного файла вступило в силу, необходимо снова выполнить команду crontab имя_файла. При этом все предыдущие настройки crontab будут перезаписаны новыми. Кроме того, не следует путать конфигурационный файл crontab с тем файлом, который создаете Вы сами. Команда crontab имя_файла копирует содержимое Вашего файла в специальный файл crontab, после этого Ваш файл в процессе больше не участвует.

Что нужно писать в конфигурационном файле?

Конфигурационный файл состоит из строк, каждая из которых описывает программу, которая будет запускаться по расписанию. Каждая строка состоит из 6 полей, поля отделяются друг от друга пробелом или табуляцией. Поля имеют следующее назначение:

  1. Минуты (0-59)
  2. Часы (0-23)
  3. День месяца (1-31)
  4. Месяц в году (1-12)
  5. День недели (0-6, при этом 0 означает воскресенье)
  6. Программа, которая будет запущена

Каждое из первых 5 полей может быть записано несколькими способами:

  1. Символом * (означает любое значение)
  2. Списком через запятую (1,2,3)
  3. Диапазоном через тире (1-31)
  4. Шагом значений диапазона (например */2 означает через_раз)

Кроме того, Вы можете получать по почте результаты и ошибки выполнения программ, запускаемых демоном 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-скриптов указывать путь до интерпретатора не нужно, так как путь уже указан в заголовке самого скрипта.

Если что-то не получается, всегда можно спросить у нас.