Нужно, чтобы крон запускался часто (например, каждые 10 минут). При этом иногда возникают проблемы.
Запускаемые по крону модули, работают с внешними сайтами и связь с ними может быть плохой, то скрипт отключается по таймауту установленному в PHP.ini . Это нормальная ситуация, но крон портит все дело - он считает, что надо продолжать эту операцию целый час и выдает сообщение: "Время выполнения регулярных процедур превысило час, скорее всего это зависание". Целый час крон не работает, а выдает: "Попытка перезапуска выполнения регулярных процедур (cron) в то время, как они уже выполняются."
Задача
Нужно, чтобы крон запускался часто (например, каждые 10 минут). При этом иногда возникают проблемы.
Запускаемые по крону модули, работают с внешними сайтами и связь с ними может быть плохой, то скрипт отключается по таймауту установленному в PHP.ini . Это нормальная ситуация, но крон портит все дело - он считает, что надо продолжать эту операцию целый час и выдает сообщение: "Время выполнения регулярных процедур превысило час, скорее всего это зависание". Целый час крон не работает, а выдает: "Попытка перезапуска выполнения регулярных процедур (cron) в то время, как они уже выполняются."
Решение
Когда cron запускается, то Drupal устанавливает переменную "cron_semaphore" в текущее время для того, чтобы одновременно случайно не запустить два крона. Если вы уверены, что больше 5 минут у вас всё равно cron не будет работать, то можно попробовать поменять строчку 2507 в файле /includes/common.inc - функция drupal_cron_run :
if (time() - $semaphore > 3600) {
// Either cron has been running for more than an hour or the semaphore
// was not reset due to a database error.
watchdog('cron', 'Cron has been running for more than an hour and is most likely stuck.', array(), WATCHDOG_ERROR);
// Release cron semaphore
variable_del('cron_semaphore');
}
else {
// Cron is still running normally.
watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
}
}
Попробуйте поменять в строке 2507 число 3600 на максимальное время (в секундах) работы вашего cron-скрипта. Эта ошибка исчезнет, но я, естественно, не могу гарантировать, что не появятся другие :)
Таким образом, если поставить семафор на 10 минут, а крон запускается каждые 6 минут, то при зависании крона после 1 пропуска запускается снова.
Использованные материалы:
Как оптимизировать cron.php










