menu hover
FAQ по хостингу »

Крон

1. Что такое CRON?

2. Как мне добавить крон-запись?

3. Не работает крон

4. Как разносить задания cron по времени?

5. Как ограничить время CPU для определенной программы?

6. У меня в админке скрипта пишет, что не отрабатывает крон.

1. Что такое CRON?

CRON это программа, выполняющая задания по расписанию. Выполняет периодический запуск заданий. Т.е. задание можно запустить в определенное время или через определенный промежуток времени. Более подробно про использование CRON и команды crontab можно почитать на http://www.codenet.ru/webmast/php/cron.php

2. Как мне добавить крон-запись?

Пожалуйста, используйте панель для работы с кроном. Если вы измените крон вручную (через консоль SSH), панель затрет эти изменения. Используйте галочки "подавлять вывод"/"подавлять ошибки", чтобы избавиться от назойливых почтовых сообщений от крон-демона. При их установке стандартный поток вывода и вывод ошибок будут перенаправлены в /dev/null.

Для того, чтобы проверить работу крона, нужно зайти под своим аккаунтом на сервер по ssh и выполнить указываемую в нем команду. Таким образом Вы сможете увидеть ошибки, если они есть.

Если Вы хотите получать на почту уведомления о выполненном кроне, Вы можете задать переменную MAILTO: в меню "Установить переменные крона".

Если у вас возникают трудности с созданием cron-задания, вы можете воспользоваться визардом для создания cron-заданий, выберите меню "Добавить крон визардом".

Для начала определитесь, когда и как часто должно выполняться ваше задание. Затем удерживая нажатой клавишу CTRL выберите желаемые значения в списках. Если вы хотите чтобы задание выполнялось во всех значениях параметров (каждую минуту/час/день/) - выберите в окошках параметры (каждую минуту/час/день). Если вы хотите чтобы крон выполнялся каждый день каждый месяц, то в полях "дни", "месяцы" и "дни недели" можно ничего не выбирать. Если в списках параметров не выбраны значения - крон будет выполняться каждую минуту/час/день/месяц/день недели. После выбора всех необходимых значений, В поле "Команда" укажите выполняемую команду. К примеру:

/usr/local/bin/php /home/firstacc/domain.com/cron.php.

После чего нажмите [ok].

3. Не работает крон

Указывайте полные пути к файлам, например /usr/local/bin/wget вместо wget Узнать, где находится файл Вы можете командой which, например which wget

Бывает, что на это время на сервере уже назначено слишком много заданий, например:

*/2 * * * * cd /home/acc/domain.com/cgi-bin/fet/secured && /usr/local/bin/php -q /home/acc/domain.com/cgi-bin/fet/secured/mastercron.php

все процессы запускаются одновременно и им может просто не хватить на всех ресурсов, в этом случае перед командой крона вставьте небольшую задержку, например

*/2 * * * * sleep 49; cd /home/acc/domain.com/cgi-bin/fet/secured && /usr/local/bin/php -q /home/acc/domain.com/cgi-bin/fet/secured/mastercron.php

4. Как разносить задания cron по времени?

Не запускайте 100 крон-заданий в одно и то же время. Лучше равномерно их распределите. Если надо, чтобы крон запускался один или несколько раз в час, делайте это в разные минуты:
11 * * * * command - запустится на одиннадцатой минуте
23,46,9 * * * * command - на 23, 46 и 9 минутах соответственно.

Если есть скрипты, которые надо запускать каждую минуту, распределяйте их напротяжении этой минуты командой задержки sleep
* * * * * sleep 20; command - запустится на 20-й секунде минуты.

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

Поля времени ( * * * * * ):

минуты 0-59
часы 0-23
дни месяца (числа) 0-31
месяц 1-12
дени недели 0-7 (0 и 7 — воскресенье)
5. Как ограничить время CPU для определенной программы?

Используя команду ulimit, например:

sh -c 'ulimit -t 30 && exec /usr/local/bin/ffmpeg агрументы'

разрешит ffmpeg забрать максимум 30 секунд процессора. Ограничивается именно процессорное время, а не общее время, которое процесс может выполняться.

Дополнительно можно запускать с пониженным приоритетом:

/usr/bin/nice -n 20 sh -c 'ulimit -t 30 && exec /usr/local/bin/ffmpeg агрументы'

где:
20 - это минимальный приоритет;
0 - нормальный приоритет (выставляется по умолчанию)

6. У меня в админке скрипта пишет, что не отрабатывает крон.

Одна из возможных ситуаций - крон долго выполняется (или зависает) и запускается другой такой же, в результате чего это задание не отрабатывает. Для избежания таких ситуаций рекомендуется использовать утилиту lockf:

/usr/bin/lockf -kst0 /tmp/lock_cron1 /usr/local/bin/php /home/acc/domain.com/cron.php

Эта команда справедлива для серверов на базе FreeBSD.

На Linux серверах эта команда выглядит чуть иначе:

/usr/local/bin/halockrun -cn /tmp/

halockrun входит в пакет hatools, его нужно устанавливать отдельно через менеджер пакетов Linux.

Также часто возникают проблемы из-за одновременного запуска большого количества заданий cron. В таких случаях, когда нужно часто запускать большое количество кронов, их лучше организовывать в одном скрипте, и при помощи cron вызывать такой скрипт.

Например, есть несколько кронов:

* * * * * /usr/local/bin/php /home/acc/domain1.com/cron.php
* * * * * /usr/local/bin/php /home/acc/domain2.com/cron.php
* * * * * /usr/local/bin/php /home/acc/domain3.com/cron.php

их запуск можно оформить в виде shell скрипта (назовём его 1mincron.sh):

#!/bin/sh
/usr/local/bin/php /home/acc/domain1.com/cron.php
/usr/local/bin/php /home/acc/domain2.com/cron.php
/usr/local/bin/php /home/acc/domain3.com/cron.php

выдать права на выполнение:

chmod +x 1mincron.sh

тогда задание cron будет выглядеть таким образом:

* * * * * /usr/bin/lockf -kst0 /tmp/lock_1mincron /home/acc/1mincron.sh

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