Крон перестал бегать; В журналах написано: «Попытка перезапустить cron, пока он уже запущен».

11

Какие шаги для устранения неполадок и решения этой проблемы в соответствии с заголовком?

Когда я пытаюсь запустить вручную, я сразу получаю страницу с сообщением об ошибке «Попытка перезапустить cron, когда он уже запущен».

giorgio79
источник
Я не мог вспомнить, на что способен 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 vdel -y cron_semaphore
любитель бариста
источник
3
Или удалите его вручную из таблицы переменных, если у вас есть доступ к базе данных, а не к 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 sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
kenorb
источник
3
«Менее экстремальный» вариант для 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 со всеми функциями обслуживания, оповещениями и другими задачами каждый раз, когда вы тестируете свою собственную функцию.

Nishant
источник
1
Этот модуль спас мне жизнь!
Дэн Мантила
да, этот модуль хорош, он помогает отлаживать работу cron.
Nishant
1

Вот как я решил проблему cron:

  1. Через PhpMyAdmin я заглянул в таблицу семафоров и удалил строку где name = cron
  2. Я запускал "Drush Cron" через командную строку
  3. Я видел сообщение об ошибке, которое дало мне ключ к решению проблемы; это может отличаться для вас, но для меня недавно удаленный модуль, который делил библиотеку PHP с установленным модулем, вызывал ошибку
albertski
источник
0

Для Drupal 8: drush sqlq "УДАЛИТЬ С семафора ГДЕ name = 'cron';"

Диана
источник
0

На Drupal 7, как еще один вариант,

Via drush cronя получал,

WD cron: Attempting to re-run cron while it is already running.       [warning]
Cron run failed.                                                      [error]

Это было в среде разработки и произошло потому, что предыдущий cron работал и был прерван.

На includes/common.incлинии 5413 или около этого вы найдете этот блок, https://cgit.drupalcode.org/drupal/tree/includes/common.inc?h=7.x#n5413.

  // 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. Это позволит ему работать.

Пожалуйста, не развертывайте это и верните его обратно после завершения. Это также помогает с отладкой.

rovr138
источник
-1

Я сталкивался с этим несколько раз. В Drupal 6 Если вы не используете drush, вы можете исправить это так:

1 Удалите переменные cron_% из таблицы переменных.

SELECT * FROM variable WHERE name like "cron%";

DELETE FROM variable WHERE name like "cron%";

2 очистить кеш Drupal по адресу: / admin / settings / performance

нажав кнопку «очистить кэшированные данные» в нижней части страницы.

3 Запустите cron из панели администратора / admin / reports / status / run-cron, не запускайте его из командной строки, так как это может вызвать проблемы.

4 Проверьте, что следующий автоматический запуск cron завершается как обычно.

munkiepus
источник
Добро пожаловать в ответы Drupal! Вопрос о Drupal 7. Удаление строк из этой таблицы базы данных не будет иметь большого эффекта.
kiamlaluno
Ах, я только добавил ответ, так как он не сказал конкретно, что это было для Drupal 7 в OP. Это хорошо работает для Drupal 6 и является более полным, чем обычные ответы «удалить семафор». Я подумал, что было бы полезно, если бы кто-то оказался здесь с d6. Это было неправильно? Я, кажется, был уценен за это.
Манкипус
только что обновил, чтобы удалить run cron из части командной строки, только что обнаружил, что это может вызвать проблемы
munkiepus
-1

Отладку можно выполнить с помощью xdebug, запустив cron из интерфейса администратора Admin> Конфигурация> система> cron.

Абдулла Абу Захам
источник