Я не мог вспомнить, на что способен db cron, но быстрый гугл «попытка перезапустить cron, пока он уже работает» указал мне на digitaledgesw.com/node/21 , это может применить к D7
Jimajamma
Это очень странно. Это сообщение встречается ровно один раз в коде для ядра, сразу после проверки этой переменной (через lock_acquire в drupal_cron_run). Если вы опубликуете больше информации / симптомов, указывающих на то, что она действительно отличается, я ее снова открою.
mpdonadio
Предложение: можете ли вы попробовать установить новый Drupal и настроить запуск cron каждые 3 минуты и посмотреть, есть ли у вас такой же эффект !!!
Aboodred1
Просто беги:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb
4
ДЛЯ БУДУЩИХ ЧИТАТЕЛЕЙ: Принятый в настоящее время ответ не является правильным для Drupal 7, версии Drupal, для которой вопрос. Это действительно для Drupal 6, но код Drupal 7 изменился; просто так получается, что в Drupal 7 остались остатки от Drupal 6, которые не были очищены.
kiamlaluno
Ответы:
12
Семафор cron, вероятно, заблокирован. Вы можете попробовать вызвать drupal_cron_cleanup () из любого места вашего кода (который не вызывается cron), и это должно разблокировать вашу переменную семафора cron.
Если у вас настроен режим drush в Drupal 6, вы также можете попробовать:
Или удалите его вручную из таблицы переменных, если у вас есть доступ к базе данных, а не к Drush.
Малкс
8
Не забывайте, что эти значения кэшируются в таблице cache_bootstrap.
Тостинни
1
пожалуйста, каково точное имя таблицы, потому что я не нашел cron_semaphore в таблице переменных
mohammed amine bourkadi
2
Когда я запускаю команду drush выше, я получаю «cron_semaphore not found». Есть идеи?
Найджел Уотерс
1
@NigelWaters Семафор cron стал замком в Drupal 7, но, drupal_cron_cleanup()похоже, не обновляется.
kiamlaluno
19
Резюме
Сообщение об ошибке, которое вы видите, произойдет, если будут выполнены следующие два условия:
Задания cron не завершаются (ошибка) или занимают более 4 минут;
Вы вызываете cron чаще, чем каждые 4 минуты (согласно настройке crontab, а не настройке в Drupal)
Поэтому это сообщение об ошибке является признаком того, что задачи cron либо не выполняются, либо выполняются слишком долго. (Примечание: я понимаю, что вы уже нашли виновника, но я хотел бы добавить ответ для людей, которые находят эту страницу с помощью поиска, как и я)
Фон
Первое, что нужно понять, это то, как выполняются задачи Drupal cron. Cron Drupal вызывается через регулярные промежутки времени - либо через задание cron на вашем сервере, либо после каждой загрузки страницы, если вы используете cron для бедняка, который используется по умолчанию в Drupal.
Задачи cron не обязательно запускаются каждый раз, когда вызывается cron - в Drupal есть настройка (по умолчанию 3 часа), которая говорит, как часто следует запускать задачи cron. Но эта задержка в 3 часа применяется, только если задачи cron успешно завершены.
В Drupal 7, cron использует механизмы блокировки Drupal , которые предоставляют кооперативную, консультативную систему блокировки. Одной из особенностей этой системы блокировки является то, что срок действия блокировки истекает через определенное время. В случае cron срок его действия истекает через 4 минуты - поэтому, если ваш cron вызывается каждые 3 минуты, а предыдущее задание cron не было выполнено к этому времени (либо оно падало, либо было очень медленным), вы действительно получили бы это сообщение об ошибке. ,
Тот факт, что вы устанавливаете cron каждые 12 часов, не имеет значения - поскольку задача cron в Drupal терпит неудачу / занимает слишком много времени, Drupal предполагает, что она не была запущена, поэтому пытается запустить ее снова, как только cron будет вызван. Двенадцатичасовая задержка относится только к успешным заездам.
Переменная семафора cron больше не существует в Drupal 7 - это было для более старой версии Drupal. В Drupal 7 нет надежного способа снять блокировку вручную, потому что бэкэнд блокировки может измениться - однако, если вы используете механизм блокировки ядра, вы можете снять блокировки cron, отредактировав базу данных:
DELETE FROM semaphore WHERE name ='cron';
Но, делая это, вы только исправляете симптомы - проблема, требующая решения, заключается в том, почему cron терпит неудачу / требует так много времени для запуска.
Я получаю это сообщение, но когда я запускаю cron_debug, все задания cron успешно завершаются и запускаются быстро (за исключением обновлений ядра, которые занимают ~ 5 секунд). Если источником этой проблемы являются медленные или неудачные процедуры cron, почему бы cron_debug не выделил их?
doub1ejack
1
Я не знаю, как работает модуль cron_debug, поэтому я не могу это прокомментировать. Каково значение переменной 'cron_safe_threshold'? Какие данные представляют собой таблицу «семафор»?
Алиса Хитон,
1
Это правильный ответ для Drupal 7. +1 для подробного объяснения.
kiamlaluno
Кстати, если cron не работает для вас, используйте модули Cron Debug, чтобы увидеть, на каком модуле он зависает - 9 раз из 10 это модуль поиска. Попробуйте выключить поисковый модуль, затем запустите cron вручную и посмотрите, что произойдет. Чтобы найти узлы, которые он пытается проиндексировать: drupal.stackexchange.com/questions/22825/…
Дэн Мантыла
4
cron_semaphoreПеременный Существовавший в Drupal 6, но вы используете Drupal 7, так семафоры замки перемещены в отдельную таблицу с именем semaphore.
Таким образом, решение для разблокировки семафора cron будет:
«Менее экстремальный» вариант для Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius
2
Вы можете отлаживать cron с помощью модуля Cron Debug .
Cron Debug поможет вам найти процессы cron, которые
ошибка из-за ошибок программирования или времени выполнения
время ожидания (PHP, сервер, база данных)
очень медленные
Cron Debug также позволит вам тестировать запуск определенных функций cron, в то время как другие не запускаются. Это может быть полезно для разработки функций cron, когда вы не хотите запускать полный cron.php со всеми функциями обслуживания, оповещениями и другими задачами каждый раз, когда вы тестируете свою собственную функцию.
да, этот модуль хорош, он помогает отлаживать работу cron.
Nishant
1
Вот как я решил проблему cron:
Через PhpMyAdmin я заглянул в таблицу семафоров и удалил строку где name = cron
Я запускал "Drush Cron" через командную строку
Я видел сообщение об ошибке, которое дало мне ключ к решению проблемы; это может отличаться для вас, но для меня недавно удаленный модуль, который делил библиотеку PHP с установленным модулем, вызывал ошибку
// Try to acquire cron lock.if(!lock_acquire('cron',240.0)){// Cron is still running normally.
watchdog('cron','Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);}
Изменить ifс помощью && FALSE,
// Try to acquire cron lock.if(!lock_acquire('cron',240.0)&& FALSE){// Cron is still running normally.
watchdog('cron','Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);}
И запустите Cron. Это позволит ему работать.
Пожалуйста, не развертывайте это и верните его обратно после завершения. Это также помогает с отладкой.
нажав кнопку «очистить кэшированные данные» в нижней части страницы.
3 Запустите cron из панели администратора / admin / reports / status / run-cron, не запускайте его из командной строки, так как это может вызвать проблемы.
4 Проверьте, что следующий автоматический запуск cron завершается как обычно.
Добро пожаловать в ответы Drupal! Вопрос о Drupal 7. Удаление строк из этой таблицы базы данных не будет иметь большого эффекта.
kiamlaluno
Ах, я только добавил ответ, так как он не сказал конкретно, что это было для Drupal 7 в OP. Это хорошо работает для Drupal 6 и является более полным, чем обычные ответы «удалить семафор». Я подумал, что было бы полезно, если бы кто-то оказался здесь с d6. Это было неправильно? Я, кажется, был уценен за это.
Манкипус
только что обновил, чтобы удалить run cron из части командной строки, только что обнаружил, что это может вызвать проблемы
munkiepus
-1
Отладку можно выполнить с помощью xdebug, запустив cron из интерфейса администратора Admin> Конфигурация> система> cron.
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
Ответы:
Семафор cron, вероятно, заблокирован. Вы можете попробовать вызвать drupal_cron_cleanup () из любого места вашего кода (который не вызывается cron), и это должно разблокировать вашу переменную семафора cron.
Если у вас настроен режим drush в Drupal 6, вы также можете попробовать:
источник
cache_bootstrap
.drupal_cron_cleanup()
похоже, не обновляется.Резюме
Сообщение об ошибке, которое вы видите, произойдет, если будут выполнены следующие два условия:
Поэтому это сообщение об ошибке является признаком того, что задачи cron либо не выполняются, либо выполняются слишком долго. (Примечание: я понимаю, что вы уже нашли виновника, но я хотел бы добавить ответ для людей, которые находят эту страницу с помощью поиска, как и я)
Фон
Первое, что нужно понять, это то, как выполняются задачи Drupal cron. Cron Drupal вызывается через регулярные промежутки времени - либо через задание cron на вашем сервере, либо после каждой загрузки страницы, если вы используете cron для бедняка, который используется по умолчанию в Drupal.
Задачи cron не обязательно запускаются каждый раз, когда вызывается cron - в Drupal есть настройка (по умолчанию 3 часа), которая говорит, как часто следует запускать задачи cron. Но эта задержка в 3 часа применяется, только если задачи cron успешно завершены.
В Drupal 7, cron использует механизмы блокировки Drupal , которые предоставляют кооперативную, консультативную систему блокировки. Одной из особенностей этой системы блокировки является то, что срок действия блокировки истекает через определенное время. В случае cron срок его действия истекает через 4 минуты - поэтому, если ваш cron вызывается каждые 3 минуты, а предыдущее задание cron не было выполнено к этому времени (либо оно падало, либо было очень медленным), вы действительно получили бы это сообщение об ошибке. ,
Тот факт, что вы устанавливаете cron каждые 12 часов, не имеет значения - поскольку задача cron в Drupal терпит неудачу / занимает слишком много времени, Drupal предполагает, что она не была запущена, поэтому пытается запустить ее снова, как только cron будет вызван. Двенадцатичасовая задержка относится только к успешным заездам.
Переменная семафора cron больше не существует в Drupal 7 - это было для более старой версии Drupal. В Drupal 7 нет надежного способа снять блокировку вручную, потому что бэкэнд блокировки может измениться - однако, если вы используете механизм блокировки ядра, вы можете снять блокировки cron, отредактировав базу данных:
Но, делая это, вы только исправляете симптомы - проблема, требующая решения, заключается в том, почему cron терпит неудачу / требует так много времени для запуска.
источник
cron_semaphore
Переменный Существовавший в Drupal 6, но вы используете Drupal 7, так семафоры замки перемещены в отдельную таблицу с именемsemaphore
.Таким образом, решение для разблокировки семафора cron будет:
Drupal 7
Drupal 6
источник
drush sql-query "DELETE FROM semaphore WHERE name='cron'"
Вы можете отлаживать cron с помощью модуля Cron Debug .
источник
Вот как я решил проблему cron:
name = cron
источник
Для Drupal 8: drush sqlq "УДАЛИТЬ С семафора ГДЕ name = 'cron';"
источник
На Drupal 7, как еще один вариант,
Via
drush cron
я получал,Это было в среде разработки и произошло потому, что предыдущий cron работал и был прерван.
На
includes/common.inc
линии 5413 или около этого вы найдете этот блок, https://cgit.drupalcode.org/drupal/tree/includes/common.inc?h=7.x#n5413.Изменить
if
с помощью&& FALSE
,И запустите Cron. Это позволит ему работать.
Пожалуйста, не развертывайте это и верните его обратно после завершения. Это также помогает с отладкой.
источник
Я сталкивался с этим несколько раз. В Drupal 6 Если вы не используете drush, вы можете исправить это так:
1 Удалите переменные cron_% из таблицы переменных.
2 очистить кеш Drupal по адресу: / admin / settings / performance
нажав кнопку «очистить кэшированные данные» в нижней части страницы.
3 Запустите cron из панели администратора / admin / reports / status / run-cron, не запускайте его из командной строки, так как это может вызвать проблемы.
4 Проверьте, что следующий автоматический запуск cron завершается как обычно.
источник
Отладку можно выполнить с помощью xdebug, запустив cron из интерфейса администратора Admin> Конфигурация> система> cron.
источник