Кто знает для чего нужна переменная семафора в кроне? Получаетcя крон не запускается из-за неё. После её очистки крон работает хорошо некоторое время, но потом опять перестает запускаться, пока не почистишь её. Получается в семафор прописывается какое-то значение и не дает нормально работать.
Комментарии
http://drupal.org/node/146551
Переменная нужна чтобы крон запускался только в одном потоке, дабы не навредить данным при одновременном запуске двух потоков не знающих друг о друге. Реализация кривовата, сам стыкался с проблемами семафора.
Вообще, если настроить запуск крона из одного источника, то по всей вероятности он же и будет запускаться в одном потоке. Вероятность запуска одновременно из несколькких потоков очень мала. Может если установить запуск из одного места так может этот семафор постоянно обнулять при запуске функции крона?
Никто не может быть уверен что она мала. У вас она мала, а у меня допустим крон запускается раз в минуту и вероятность очень даже велика, или например я запускаю крон руками в тот момент как он уже запущен. А на крон могут быть подвешены вещи, изменяющие данные, со всем вытекающим. Сейчас реализация сделана на то, чтобы предотвратить порчу данных, с чем она и справляется. Новая система разрабатывается по ссылке выше, если у вас есть что сказать, то говорите там, я всего лишь объяснил текущую реализацию.
Согласен, что уверенности в малой вероятности нет.
И вот получается, что предусмотрена функция для очистки семафора, но она не работает или работает но не совсем так как должно быть.
<?php
// Release cron semaphore
function drupal_cron_cleanup() {
// See if the semaphore is still locked.
if (variable_get('cron_semaphore', FALSE)) {
watchdog('cron', 'Cron run exceeded the time limit and was aborted.', array(), WATCHDOG_WARNING);
variable_del('cron_semaphore');
}
}?>
Получается надо идти по другому пути, надо искать причины ведущие
к неправильной работе и скорее всего упирается скорее всего в хостинг с его настройками сервера.
Причина проста — прерывание работы крона во время его работы. Варианты — от насильного прерывания на сервере, до die() в каком-то из модулей на hook_cron().
Получается, если конфигурация на локальном компьютере имеет модулей даже больше чем на реальном сервере и крон работает нормально, то причина не в модуле, а в настройках реального сервера
или смерти по таймауту
приходилось хардкодить переменную один раз.
фактически увеличить время таймаута в коде ядра функции крона?
время работы PHP скрипта.
к php.ini доступа нет, а средствами языка - не помогает
тут транзакции могли-бы помочь, при условии что речь идет о работе с б.д., правда могут быть и файловые операции, и мыло... ну и таблицы тогда надо в InnoDb переводить например. А для обнуления переменной можно время жизни указать ее - заведомо большее чем один вызов крона (например 30мин. или 2 ч.), потом автоматом чистить.