Cron — запуск программ пользователя в указанное время
В ОС Unix существует возможность запускать программы пользователя в указанное им время. Для этого используется программа cron, которая получает инструкции от пользователей и следуя им производит выполнение любых задач по полученным сценариям. Наши клиенты могут пользоваться данной возможностью для выполнения периодических задач.
- Как настраивать cron
- Примеры использования cron
- Как запускать PHP-скрипты по расписанию
- Как получать сообщения об ошибках от программ, запускаемых cron
- Ограничения
- Полезные ссылки
Как настраивать cron
Конфигурирование сценариев cron производится через unix shell. Прежде всего нужно определить какие программы вы хотите запускать и узнать полные пути к ним на диске сервера. Для этого перейдите с помощью команды cd в каталог где находится запускаемая программа и узнайте полный путь к этому каталогу с помощью команды pwd. Путь может выглядеть например как /home/u12345/scripts/script.pl. Убедитесь что файл, который вы хотите запускать, имеет права на чтение+исполнение (r+x) для владельца файла.
Поменять права на нужные можно командой:
chmod 750 script.pl
Далее выполните команду crontab -e. Вы окажетесь в текстовом редакторе vi, где сможете вводить текст сценария для cron. Краткая справка по редактору vi:
- для вставки текста нажмите i, затем вводите текст
- для удаления символов нажмите ESC, а затем наберите x
- для выхода из vi без сохранения изменений нажмите ESC, а затем наберите :q!
- для сохранения и выхода нажмите ESC, а затем наберите :wq
Задания для cron пишутся по одному в строке. После каждой строки, в том числе после последней или единственной, обязательно нужно нажать enter — иначе задания работать не будут.
Задание для cron выглядит как строка, в начале находятся пять обязательных полей для указания периодичности задания, а далее следует команда, которую нужно запускать:
поле1 поле2 поле3 поле4 поле5 команда
Значения первых пяти полей:
- минуты — число от 0 до 59
- часы — число от 0 до 23
- день месяца — число от 1 до 31
- номер месяца в году — число от 1 до 12
- день недели — число от 0 до 7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)
Для каждого конкретного параметра можно задать несколько значений через запятую. Например, если в поле «часы» написать 1,4,22, то задание будет запущено в 1 час ночи, в 4 часа утра и в 22 часа. Можно задать интервал — 4-9 будет означать, что программу нужно запускать каждый час в период с 4 до 9 часов включительно. Символ '*' означает «все возможные значения». Например, указание '*' в поле «часы» будет означать «запускать каждый час». Символ '/' служит для указания дополнительной периодичности задания. Например, '*/3' в поле «часы» означает «каждые три часа».
Итак, как выглядит простейший сценарий cron:
0 */3 * * 2,5 /home/u12345/script.pl
Скрипт /home/u12345/script.pl будет автоматически запускаться каждые три часа во вторник и в пятницу. Введя такой сценарий в редакторе vi выйдите с сохранением результатов редактирования и, если вы не допустили ошибок, задание будет поставлено на выполнение с указанной периодичностью. Если при редактировании были допущены ошибки, cron сообщит вам о них.
Например:
/tmp/crontab.xxxxxxx: 1 строк, 9 символов
crontab: installing new crontab
"/tmp/crontab.xxxxxxx":1: bad minute
crontab: errors in crontab file, can't install
Do you want to retry the same edit?
Исправьте ошибки и попробуйте сохранить задание опять.
Посмотреть список уже установленных в cron сценариев можно командой crontab -l:
-bash-2.05b$ crontab -l
0 */3 * * 2,5 /home/u12345/script.pl
Рекомендация: если требуется запускать какую-то программу один раз в день, особенно если она требует для выполнения больших ресурсов, выполняйте такое задание ночью, в период с 2 до 8 часов — нагрузка на серверы в это время минимальна.
Примеры использования cron
Ниже приводятся примеры заданий для cron. Надеемся, эта информация поможет вам лучше понять работу этой программы.
# выполнять задание раз в час в 0 минут
0 */1 * * * /home/u12345/script.pl
# выполнять задание каждые три часа в 0 минут
0 */3 * * * /home/u12345/script.pl
# выполнять задание по понедельникам в 1 час 15 минут ночи
15 1 * * 1 /home/u12345/script.pl
# выполнять задание 5 апреля в 0 часов 1 минуту каждый год
1 0 5 4 * /home/u12345/script.pl
# выполнять задание в пятницу 13 числа в 13 часов 13 минут
13 13 13 * 5 /home/u12345/script.pl
# выполнять задание ежемесячно 1 числа в 6 часов 10 минут
10 6 1 * * /home/u12345/script.pl
Как запускать PHP-скрипты по расписанию
Вы можете выполнять запуск скриптов на языке PHP в указанное время с желаемой периодичностью. Для этого требуется использовать PHP-CLIинтерпретатор, пример использования которого описан здесь.
Поскольку не все PHP-программы могут работать через CLI SAPI без предварительной модификации, можно запускать их через wget. Например:
/usr/local/bin/wget -O /dev/null -q http://mysite.tld/cron.php?action=123
Если в скрипте используются функции require, include, причём в них указаны относительные пути, то в начале выполняемого скрипта используйте вызов функции chdir(), которая задаст текущую рабочую директорию.
Как получать сообщения об ошибках от программ, запускаемых cron
Если при выполнении программы, которая запускается из cron, возникли ошибки, наверняка вы захотите получать сообщения об этих ошибках, чтобы полностью контролировать работу периодически запускаемых заданий. Для этого в начале cron-сценария поместите такую строку:
MAILTO=адрес@домен.ru
Конечно, адрес@домен.ru нужно заменить на реально существующий адрес электронной почты куда надо будет доставлять уведомления. Если нужно получать сообщения об ошибках на несколько адресов, укажите все эти адреса через запятую.
Обратите внимание на то, что cron будет присылать по почте то, что выводят запускаемые скрипты. Например, если вы напишете скрипт, который будет печатать строчку «Hello, world» и поставите его на выполнение через cron, вы будете получать по почте письмо со строкой «Hello, world» каждый раз, когда cron будет запускать такой скрипт.
Чтобы избежать этого, например когда текст, выводимый скриптом, вам не нужен, надо добавить в конец строки-сценария для cron символы
> /dev/null 2>&1
Полностью строка для cron будет выглядеть так:
Для PHP4:
0 1 * * * /usr/local/bin/php -q $HOME/script.php > /dev/null 2>&1
Для PHP5:
0 1 * * * /usr/local/bin/php -q $HOME/script.php > /dev/null 2>&1
Рекомендуем проверять корректность синтаксиса скриптов, которые вы устанавливаете на выполнение через cron. Скрипты могут содержать ошибку, могут неодинаково работать при запуске через веб-сервер и через cron и так далее. Для того, чтобы убедиться что скрипт будет правильно работать через cron, предварительно проверьте его такой командой в unix shell:
Для PHP4:
/usr/local/bin/php -l script.php
Для PHP5:
/usr/local/bin/php -l script.php
Если ошибок в скрипте нет, вы увидите сообщение «No syntax errors detected in script.php».
Ограничения
Для программ, которые запускаются через cron, действуют такие же ограничения по потребляемым ресурсам, как для процессов, запускаемых пользователем в unix shell. Речь идет об ограничениях на время выполнения программы, количеству доступной памяти, ограничениях на размер файлов и так далее.
Кроме того, существует ограничение на периодичность запуска программ из cron. Пользователь может запускать свои программы таким образом не чаще чем 1 раз в 1 час.
Полезные ссылки
- man (5) crontab — man-страница по программе crontab