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

Прислано: Dan

пн, 04/09/2006 - 21: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.

Опишу вкратце этот формат и я :)
Строка может быть трёх типов: комментарий (начинается с #), задание переменной среды (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 :)
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".

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

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

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

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано dyp@drupal.org в пн, 04/09/2006 - 21:48.

image.module
simplenews.module
votingapi.module


Опубликовано Dan в пн, 04/09/2006 - 22:18.

ок, спасибо - добавил


Опубликовано Flinblo в вт, 05/09/2006 - 08:02.

http://www.webcron.org/


Опубликовано Gedler в сб, 17/03/2007 - 04:46.

дергаю cron wget-том:
/usr/bin/wget -q --append-output=/dev/null http://myhost/cron.php > /dev/null
все прекрасно отрабатывает по расписанию, но на хостинге происходит следующее:

это нормально?


Опубликовано Natalie в сб, 17/03/2007 - 04:56.

Эти файлы должны автоматически удаляться
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.


Опубликовано Gedler в сб, 17/03/2007 - 13:31.

как видите не удаляются )))
сапорта пинать?
кстати это может быть связано с тем что php safe mode включен?


Опубликовано Dan в сб, 17/03/2007 - 21:59.

А такая команда тоже не работает:
/usr/bin/wget -O - -q http://www.ВашСайт.ru/cron.php
?


Опубликовано Gedler в ср, 04/04/2007 - 09: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 в чт, 24/05/2007 - 09:33.

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


Опубликовано sasa-zmei в пн, 23/07/2007 - 13:34.

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


Опубликовано ursus в пн, 23/07/2007 - 13:45.

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


Опубликовано ursus в пн, 23/07/2007 - 21:12.

Кхм, мой вопрос в другом: какое значение ставить в опции Cron runs interval ?


Опубликовано Gedler в вт, 24/07/2007 - 06:06.

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


Опубликовано marazmus в ср, 03/10/2007 - 03:49.

Эту статью нужно добавить в подшивку (book) документации.


Опубликовано demoemo в вт, 27/11/2007 - 15:59.

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

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


Опубликовано Dan в ср, 28/11/2007 - 21:38.

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

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


Опубликовано seaji в чт, 29/11/2007 - 15:19.

А вот с этим как бороться, ни кто не знает.
База крошечная 30 Мб. Ни каких рассылок.


Опубликовано PVasili в чт, 29/11/2007 - 19:36.

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


Опубликовано seaji в чт, 29/11/2007 - 22:39.

Быстрая диагностика зависания крона:
http://drupal.ru/node/9732


Опубликовано Valeratal в ср, 26/12/2007 - 21:16.

спасибо


Опубликовано fasdalf@fasdalf.ru в ср, 09/01/2008 - 14:27.

На половине хостингов катит так

Пример (запуск 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


Опубликовано digital_sword в вс, 20/01/2008 - 21:09.

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


Опубликовано Gedler в пн, 21/01/2008 - 10:08.

digital_sword написал(а):

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

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


Опубликовано Dan в пн, 21/01/2008 - 20:14.

0 1,13 * * * wget -O - -q http://www.example.ru/cron.php


Опубликовано basil85 в ср, 20/02/2008 - 19:18.

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


Опубликовано PVasili в ср, 20/02/2008 - 19:31.

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


Опубликовано Gedler в чт, 21/02/2008 - 04:49.

век живи, век учись...
спасибо


Опубликовано Литклуб в сб, 23/02/2008 - 22:44.

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

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


Опубликовано vadbars@drupal.org в вс, 24/02/2008 - 07:41.

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

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


Опубликовано VladSavitsky в вт, 27/05/2008 - 22:40.

Drupal CookBook - Готовить может каждый!Решение было сохранено на сайте DrupalCookBook.ru:
Запуск хронометра (cron).
Авторы, предложившие решения, также указаны в сохранённой статье.


Опубликовано a.mohax в пн, 02/03/2009 - 09:44.

"fasdalf@fasdalf.ru" написал(а):

Пример (запуск 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

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


Опубликовано fasdalf@fasdalf.ru в пн, 02/03/2009 - 09:46.

Любую, на выбор.


Опубликовано jackal в ср, 23/09/2009 - 06:20.

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


Опубликовано Dan в ср, 23/09/2009 - 16:09.

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


Опубликовано jackal в чт, 24/09/2009 - 00:25.

Я правильно понимаю: он не видет его настройки, но видет последнее время срабатывания?


Опубликовано Dan в чт, 24/09/2009 - 01:16.

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


Опубликовано jackal в чт, 24/09/2009 - 08:17.

Спасибо за помощь! Все понял!


Опубликовано keha3912 в пн, 19/10/2009 - 06:41.

хорошая таблица сравнений различных вебсервисов хрона http://www.onlinecronservices.com/
бесплатный и работающий к примеру есть http://www.onlinecronjobs.com/ (на англ.)


Опубликовано Dice в вт, 08/12/2009 - 13:32.

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


Опубликовано Dan в вт, 08/12/2009 - 17:35.

Спасибо. Статье уже три года, а она всё актуальна. Удивительно! :)


Опубликовано Dice в чт, 10/12/2009 - 17:36.

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

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

38 * * * * lynx -source http://www.example.ru/cron.php > /dev/null 2>&1


Опубликовано Dan в чт, 10/12/2009 - 19: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 в чт, 10/12/2009 - 21:17.

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

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


Опубликовано Dan в пт, 11/12/2009 - 13:21.

"Dice" написал(а):

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

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


Опубликовано Dice в пт, 11/12/2009 - 17:40.

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


Опубликовано Dan в пт, 11/12/2009 - 19:45.

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

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

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


Опубликовано Dice в пт, 11/12/2009 - 20:37.

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


Опубликовано orangeudav в сб, 16/01/2010 - 16:44.

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


Опубликовано Dan в сб, 16/01/2010 - 17:44.

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


Опубликовано orangeudav в вс, 17/01/2010 - 11:54.

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

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


Новое на сайте