Крон: для чего нужна переменная семафора? Какова задумка автора?

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

Аватар пользователя VladoMire VladoMire 11 января 2010 в 19:12

Кто знает для чего нужна переменная семафора в кроне? Получаетcя крон не запускается из-за неё. После её очистки крон работает хорошо некоторое время, но потом опять перестает запускаться, пока не почистишь её. Получается в семафор прописывается какое-то значение и не дает нормально работать.

Комментарии

Аватар пользователя neochief neochief 11 января 2010 в 19:34

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

Аватар пользователя VladoMire VladoMire 11 января 2010 в 20:08

Вообще, если настроить запуск крона из одного источника, то по всей вероятности он же и будет запускаться в одном потоке. Вероятность запуска одновременно из несколькких потоков очень мала. Может если установить запуск из одного места так может этот семафор постоянно обнулять при запуске функции крона?

Аватар пользователя neochief neochief 11 января 2010 в 21:20

Никто не может быть уверен что она мала. У вас она мала, а у меня допустим крон запускается раз в минуту и вероятность очень даже велика, или например я запускаю крон руками в тот момент как он уже запущен. А на крон могут быть подвешены вещи, изменяющие данные, со всем вытекающим. Сейчас реализация сделана на то, чтобы предотвратить порчу данных, с чем она и справляется. Новая система разрабатывается по ссылке выше, если у вас есть что сказать, то говорите там, я всего лишь объяснил текущую реализацию.

Аватар пользователя VladoMire VladoMire 11 января 2010 в 21:44

Согласен, что уверенности в малой вероятности нет.
И вот получается, что предусмотрена функция для очистки семафора, но она не работает или работает но не совсем так как должно быть.

<?php
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);

    

// Release cron semaphore
    
variable_del('cron_semaphore');
  }
}
?>

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

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

Причина проста — прерывание работы крона во время его работы. Варианты — от насильного прерывания на сервере, до die() в каком-то из модулей на hook_cron().

Аватар пользователя VladoMire VladoMire 11 января 2010 в 22:33

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

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 12 января 2010 в 10:58

"neochief" wrote:
Причина проста — прерывание работы крона во время его работы. Варианты — от насильного прерывания на сервере, до die() в каком-то из модулей на hook_cron().

или смерти по таймауту
приходилось хардкодить переменную один раз.

Аватар пользователя orbisnull orbisnull 14 января 2010 в 6:06

тут транзакции могли-бы помочь, при условии что речь идет о работе с б.д., правда могут быть и файловые операции, и мыло... ну и таблицы тогда надо в InnoDb переводить например. А для обнуления переменной можно время жизни указать ее - заведомо большее чем один вызов крона (например 30мин. или 2 ч.), потом автоматом чистить.