Оживление хрона

Главные вкладки

Аватар пользователя Dan Dan 5 сентября 2006 в 1:02

- Что значит слово крон?

Сразу оговорюсь, я против перевода слова cron как крон. И против использования непосредственно cron. Считаю правильным вариант хрон (от греческого chronos - время). В русском языке, кстати, используется именно эта форма (произношение) - хронометр. Со мной согласен и словарь Lingvo, переводящий cron как хрон. Однако здесь народ решил, что лучше использовать слово cron. Ну что ж, да будет так.

- А что значит cron в компьютерном контексте?

Wikipedia говорит о cron следующее:
cron — планировщик задач, демон в Юникс-образных операционных системах для периодического выполнения заданий в заданное время.
Каждый пользователь системы имеет свой файл заданий crontab, в котором описано, в какое время и какие программы запускать от имени этого пользователя. Для редактирования файла crontab используется специальная программа crontab. Это сделано для того, чтобы во время редактирования cron мог продолжать работу.
От себя добавлю, аналог cron`а в Windows - Планировщик заданий.

- Зачем cron Drupal`у?

Для нормального функционирования, некоторые модули требуют периодического технического обслуживания. Например, модулю watchdog надо удалять старые сообщения, а модулю search - индексировать содержимое сайта.
Список модулей ядра, использующих cron:

  • aggregator.module
  • drupal.module
  • node.module
  • ping.module
  • poll.module
  • search.module
  • statistics.module
  • watchdog.module

Краткий список сторонних модулей, использующих cron:

  • db_maintenance.module
  • freemind.module
  • privatemsg.module
  • image.module
  • simplenews.module
  • votingapi.module
  • ....(добавьте свой!)

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

- Как узнать точно, какие модули используют cron?

Надо поискать текст _cron() во всех файлах в каталоге modules. Если модуль использует cron, то в его исходном тексте будет строка: function ИмяМодуля_cron().

- Как можно запустить cron Drupal`а вручную?

Очень просто: просто наберите в броузере http://www.ВашСайт.ru/cron.php. Откроется пустая страница - так и должно быть. В случае успешного выполнения, в логах Drupal`а (/admin) останется сообщение.

- А можно сделать так, чтобы Drupal сам себя обслуживал (запускал для себя cron)?

Можно. Для этого нужно установить модуль Poormanscron. Он также может пригодиться, если Вы не можете настроить системный cron.

- Какие в интернете есть сервисы предоставляющие услуги cron?

www.cron-server.de - на немецком
www.webcron.org - на француском (есть английский)

- А как сделать, чтобы cron.php (или другой скрипт / другая программа) вызывался операционной системой?

Нужно в файл .crontab, находящийся в Вашем домашнем каталоге, занести строчку, которая будет содержать время и имя программы/скрипта.

- Какой формат у файла crontab?

В Wikipedia можно вкратце посмотреть о формате с примерами.
На сайте www.opennet.ru есть man`ы на русском языке, в частности по формату файла crontab`а. Ну а самую актуальную, для Вашей системы, информацию Вы получите, набрав команду man 5 crontab.

Опишу вкратце этот формат и я Smile
Строка может быть трёх типов: комментарий (начинается с #), задание переменной среды (SHELL,MAILTO,PATH,LOGNAME,HOME) или команда для cron. Строки не могут смешиваться, то есть нельзя писать комментарий в строке с командой.
С первым типом всё понятно - комментарий он и есть комментарий.
Второй тип - задание переменной выглядит как "имя_переменной = величина". За подробностями о переменных обращайтесь в справку.
Ну и третий тип, самый интересный для нас, выглядит как шесть полей разделённых пробельными символами (пробелы и/или знаки табуляции). Первые пять полей задают время для команды, шестой - имя программы:

(минуты:0-59) (часы:0-23) (дни месяца:0-31) (месяц:0-12) (день недели:0-6, 0-воскресенье) (программа_с_параметрами)

Каждое из первых пяти полей может быть задано следующим образом:

  • Звёздочка (*) - обозначает весь диапазон (от первого до последнего)
  • Диапазон чисел, от и до. Например "5-7" будет означать 5,6 и 7
  • Списки. Это числа (или диапазоны) разделенные запятыми. Например: "1,5,10,11" или "1-11,19-23".
  • Звёздочка или диапазон с шагом. Используется для пропусков в диапазонах. Шаг указывается после косой черты. Например "2-10/2" будет значить "2,4,6,8,10", а выражение "*/2" в поле "часы" будет означать "каждые два часа.

Последнее поле (шестое) определяет команду для запуска.

Примеры (взяты из Wikipedia):

# как обычно, с символа '#' начинаются комментарии
# в качестве командного интерпрететора использовать /bin/sh
SHELL=/bin/sh
# результаты работы отправлять по этому адресу
MAILTO=paul@example.org
# добавить в PATH
PATH=$PATH:$HOME/bin

#### Здесь начинаются задания
# выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily
5 0 * * * $HOME/bin/daily.job >> $HOME/log/daily 2>&1
# выполнять 1 числа каждого месяца
15 14 1 * * $HOME/bin/monthly
# каждый рабочий день в 22:00
0 22 * * 1-5 echo «Пора домой» | mail -s «Уже 22:00» john

23 0-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»

- Какую команду нужно использовать, чтобы "дёрнуть" cron.php?

Можно использовать wget или lynx.
Пример (запуск cron.php каждый час):

0 * * * * /usr/bin/wget -O - -q http://www.ВашСайт.ru/cron.php
0 * * * * /usr/bin/lynx -source http://www.ВашСайт.ru/cron.php > /dev/null 2>&1

перед тем, как записывать эти команды себе в crontab, проверьте, что программа (wget или lynx) находится в /usr/bin. Это может быть не так! Для проверки пути wget запустите whereis wget - будет выведен список файлов, содержащих слово wget.

- Как занести запись в crontab?

Для этого есть одноимённая программа: crontab Smile
On-line man-страница: crontab. Ну а "правильную" помощь Вы получите, набрав в unix-shell man 1 crontab.

Формат команды:
crontab { -l | -r | -e }
где:
-l - выводит текущих crontab файл на стандартный вывод.
-r - удаляет текущий crontab файл.
-e - используется для редактирования текущего crontab используя редактор, заданный переменной окружения VISUAL или EDITOR.
Таким образом, вводим crontab -e, добавляем нужную строку с командой и нажимаем "Ctrl-D".

- А ещё ссылочки по теме есть?

А то! Пожалуйста:

Мало? Присылайте свои Smile

Комментарии

Аватар пользователя Gedler Gedler 4 апреля 2007 в 13:09

работает но результат тот же.
куча мусора, который удаляю в ручную.
сапорт все валит на скрипт:
----
>Запускаю с сервера
[root@xxx /home/xxxx]# /usr/local/bin/php /xxxxxx/public_html/cron.php

Выдает ошибки:

shmget() failed: Cannot allocate memory
Failed to start up concurrent users module!

Warning: main(): Unable to access ./includes/bootstrap.inc in /home/beautysp/public_html/cron.php on line 9

Ошибка где то в скрипте, разобраться не зная системы нам будет трудно.
В таких случаях лучше у разработчиков спросить почему выходит такая
ошибка.

-----
при этом мои объяснения про то что скрипт при прямом вызове отрабатывает нормально, и про то что данная ошибка следствие невозможности открыть ./includes/bootstrap.inc по причине некоректности вызова с учетом системного окружения, во внимание не принимаются.
получаю следующий ответ:
--
Просто при вызове скрипта Вы не можете видеть те ошибки, которые
показываются при вызове его с сервера напрямую. Если сможете включить
дебаггер какой нибудь - все увидите.
---

в общем lol
общатся с сапортом больше не хочу - бесперспективно.

Аватар пользователя neoguru neoguru 24 мая 2007 в 13:33

Опция -q при дёрганьи wget'ом точно должа помочь. У самого была такая проблема, оказалось, что это фича wget. Он просто сохраняет страницу, которую выгреб, а если страница с данным именем уже существует, приплючоввывает счетчик в конец. Посему, как и сказал товарищ Dan, используйте -q в параметрах wget
wget -q http://www.ВашСайт.ru/cron.php

Аватар пользователя sasa-zmei sasa-zmei 23 июля 2007 в 17:34

Извините за возможно тупой вапрос: а хрон надо перезапускать периодически или его можно уже не трогать, если он уже однажды был запущен?

Аватар пользователя Gedler Gedler 24 июля 2007 в 10:06

предположим на Вашем сайте включен модуль aggregator, для публикации новостей с информационных сайтов...
вопрос в том как часто обновляются новости: раз в 30 минут, каждую минуту, раз в месяц...?
насколько актуально такое обновление на сайте?
в общем всё зависит от задач и торебований включенных модулей.

Аватар пользователя ursus ursus 23 июля 2007 в 17:45

Для нормального функционирования некоторые модули требуют периодического технического обслуживания,. Например, модулю watchdog надо удалять старые сообщения, а модулю search - индексировать содержимое сайта.

Аватар пользователя demoemo demoemo 27 ноября 2007 в 18:59

Можно. Для этого нужно установить модуль Poormanscron. Он также может пригодиться, если Вы не можете настроить системный cron.

а не грузит ли он хост!?

Аватар пользователя Dan Dan 29 ноября 2007 в 0:38

Грузит. На каждое обращение к сайту - проверка времени запуска хрона. Одно условие всего, но всё ж есть.

Потому - настраивайте системный хрон.

Аватар пользователя PVasili PVasili 29 ноября 2007 в 22:36

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

Аватар пользователя Gedler Gedler 21 января 2008 в 13:08

digital_sword wrote:
А как его запускать каждый день в час дня и час ночи?

создаете две задачи
0 1 * * * wget -O - -q http://www.example.ru/cron.php
0 13 * * * wget -O - -q http://www.example.ru/cron.php
первая будет отрабатывать в час ночи
вторая в час дня

Аватар пользователя basil85 basil85 20 февраля 2008 в 22:18

Добрый день! У меня может быть очень глупый вопрос, т.к. я новичок...
Я нашел бесплатный хостинг и поставил (не без проблем) туда друпал:
у меня есть доступ к БД (посредству phpMyAdmin) и FTP доступ...
также на хостинге есть php5.2.5, MySQL4.1.22 и места достаточно для меня.
Сам вопрос: как можно определить, какая ОС у хостера и работает ли ".crontab" на ОС, отличных от posix систем? Если не т, то есть ли подобные технологии для других систем?

Аватар пользователя PVasili PVasili 20 февраля 2008 в 22:31

1) phpinfo()
2) Можете использовать один из многочисленных сторонних сервисов, которые запустят cron.php На вашем сервере

Аватар пользователя Литклуб Литклуб 24 февраля 2008 в 1:44

А зачем эти немецкие и французские крон-сервера? Что они делают? Зачем они нам, пользователям Друпал?

И, кстати, как правильно - дрУпал, или друпАл... Мне легче произносить дрУпал. Закачал видео, а там друпАл... аж стошнило))

Аватар пользователя vadbars@drupal.org vadbars@drupal.org 24 февраля 2008 в 10:41

Сервера дергают ваш cron. Smile Не подумайте плохого - просто периодически запускают cron.php на вашем сайте.

И, кстати, как правильно - дрУпал, или друпАл...
А вы послушайте песенку про Drupal (где-то на форуме обсуждали). Там вообще слышится "ДжУпОл, джУпОл, джУпАл!" Smile

Аватар пользователя a.mohax a.mohax 2 марта 2009 в 12:44

"<a href="mailto:fasdalf@fasdalf.ru">fasdalf@fasdalf.ru</a>" wrote:
Пример (запуск cron.php каждый час, на 38 минуте):
38 * * * * wget -O - -q http://www.example.ru/cron.php
38 * * * * lynx -source http://www.example.ru/cron.php > /dev/null 2>&1

Еще вопрос, надо использовать либо первую строчку либо вторую, или обе? о_О

Аватар пользователя jackal jackal 23 сентября 2009 в 10:20

При правильной настройке crona на странице отчет о состоянии Друпал будет надпись "Запуск crona автоматичеки"?

Аватар пользователя Dan Dan 23 сентября 2009 в 20:09

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

Аватар пользователя Dan Dan 24 сентября 2009 в 5:16

Да. Сами подумайте, как он увидит настройки непонятно чего - крон можно дёргать сотней разных способов, например из сети - как смотреть?

Аватар пользователя Dice Dice 8 декабря 2009 в 16:32

Спасибо за подробное описание.
Вообще у автора статьи самые адекватные, нежели у кого-либо другого.

Аватар пользователя Dice Dice 10 декабря 2009 в 20:36

Может кому-то пригодиться следующая информация, взял отсюда. (мне бы пригодилась Lol

Чаще всего перенаправление в /dev/null используется для подавления стандартного вывода (выходного потока) и/или вывода сообщений об ошибках (потока диагностики) программы их перенаправлением в /dev/null, такое подавление чаще всего используется в командных сценариях (shell scripts) для подавления нежелательного вывода на консоль.

38 * * * * lynx -source http://www.example.ru/cron.php > /dev/null 2>&1
Аватар пользователя Dan Dan 10 декабря 2009 в 22:20

На консоль - можно, это не проблема, главное - в файл не сохранять.

В данном руководстве используется вывод lynx в null:
0 * * * * /usr/bin/lynx -source http://www.ВашСайт.ru/cron.php > /dev/null 2>&1

И wget выводит вместо файла на консоль (опция '-О -'):
0 * * * * /usr/bin/wget -O - -q http://www.ВашСайт.ru/cron.php

Аватар пользователя Dice Dice 11 декабря 2009 в 0:17

Dan
С этим то разобрался, просто не знал именно эту команду, поэтому и привел ее описание, тк писать в конфиги не знамо что не люблю, а так может кому-то еще пригодиться Smile

А вывод на консоль же в любом случае происходит авторизован ли пользователь от которого команда или нет?
Если да то тогда что будет с консолью на экране монитора, /dev/null получается предпочтительнее 0о

Аватар пользователя Dan Dan 11 декабря 2009 в 16:21

"Dice" wrote:
А вывод на консоль же в любом случае происходит авторизован ли пользователь от которого команда или нет? Если да то тогда что будет с консолью на экране монитора, /dev/null получается предпочтительнее 0о

Ты про какую консоль? Монитор у хостера? Smile
Ни друпал-пользователь, ни shell-пользователь никаких сообщений ни на какой консоли никогда не увидит.
Хрон выполняется средствами ОС и никак не завязан на пользователя (залогинен тот или нет). Вывод на консоль подавляется для того, что бы ОС не слала письма пользователю с сообщениями типа "Выполнилась команда такая-то, вывод у неё был такой-то" (хотя это можно и отключить).

Аватар пользователя Dice Dice 11 декабря 2009 в 20:40

То есть если выводится на консоль то он исполняет и пишет в логи?
А если вариант с null то логи не пишутся?
Не очень понимаю что имеется ввиду под выводом на консоль.
Зачем нам хостер мы сами себя хостим на openbsd, а простых вещей таких не знаем((

Аватар пользователя Dan Dan 11 декабря 2009 в 22:45

Процесс хрона запускается один раз при загрузке системы и висит демоном, ожидая времени выполнения программ, заданных в файле crontab.
Лог работы хрона записывается в журнал /var/spool/cron/crontabs (в Debian). Это только лог самого хрона, а не программ которые он запускает.
Программы, которые запускаются хроном могут писать в системный журнал пользуясь функцией syslog и, по идее, они ничего не должны выдавать в stdout. Если же выдают, то считается, что они хотят "сказать" что-то важное (например, что порушилась БД или используются неверные ключи для вызова программы и т.д.), поэтому формируется e-mail с содержимым вывода команды и отправляется root'у.

Как видишь, никакой консоли тут нет и в помине. Есть stdout, который нигде не отображается, т.к. он виртуальный (это буфер хрона).

Если сам себя хостишь, то такие вещи надо знать Smile

Аватар пользователя Dice Dice 11 декабря 2009 в 23:37

То что хрон при загрузке системы стартует это единственное что знаю из описанного.
Спасибо за подробный ответ.
А так да надо, поэтому потихоньку со всем подряд разбираюсь, а с хроном первый раз пришлось столкнуться, хотя раньше и читал про него, но не пробовал на ощупь.)

Аватар пользователя orangeudav orangeudav 16 января 2010 в 19:44

И все таки в приличном обществе администраторов слово "хрон" как минимум не поймут. Так что не надо пытаться ссать против ветра изменять устоявшиеся произношение..

Аватар пользователя Dan Dan 16 января 2010 в 20:44

Ещё в приличном обществе употребляют "сервак", "винда", "линух", "цыска" и т.д. Будем равняться на них?

Аватар пользователя orangeudav orangeudav 17 января 2010 в 14:54

нет, крон - это конкретный сервис на конкретной группе ОС. точка. Фактически, имя собственное.
сервак,винда,линух - это жаргонные словечки которые образованы сокращением от полных слов.

Как можно сравнивать теплое с мягким? Пример не засчитан

Аватар пользователя Dan Dan 17 января 2010 в 15:52

"orangeudav" wrote:
Как можно сравнивать теплое с мягким? Пример не засчитан

Пример Вами не понят. Есть люди которые говорят "задача", есть которые говорят "таск". "Крон" - это калька с английского, жаргон, такой же "цыска". В русском языке корректнее хрон.

"orangeudav" wrote:
это конкретный сервис на конкретной группе ОС

И что? Если это сервис, то мы название его переводить не будем? "Mail agent" будет "мыльным агентом"? А "lpd" будет "принтовым демоном"?

Это во-первых.
А во-вторых я в самом начале статьи сказал, что это моё личное мнение, я его никому не навязываю, хотя отстоять могу.

Аватар пользователя Valeratal Valeratal 18 января 2010 в 11:59

О, если бы в русском языке заимствования звучали именно как переводы, а не кальки, половина IT слов мы бы не узнали Smile

А друпал это капля (ну или каплевун) Smile

Аватар пользователя Dan Dan 18 января 2010 в 13:30

Процесс перевода это трудный и творческий процесс. Просто так им никто не будет заниматься, отсюда и выползает калька, как самое очевидное и в то же время необходимое. Но процессом сим можно и нужно управлять, иначе погрязнем. В смвоё время появились люди у которых было желание и время и составили краткий список основных терминов друпала. Если бы не этот список, некоторые элементы которого горячо обсуждались, сидели бы сейчас с нодой и юзером.
Думаю пришло время составлять новый список.