Крон перестав бігати; журнали говорять: "Спроба повторно запустити cron, поки він вже працює".


11

Які кроки для усунення та вирішення цієї проблеми відповідно до назви?

Коли я намагаюся запустити вручну, я отримую сторінку негайно, і повідомлення про помилку "Спроба повторно запустити cron, поки він вже працює".


Я не міг згадати вгорі голови, на що дивиться db cron, але швидкий гугл "спроби повторно запустити cron, поки він вже запущений" вказав мені на digitaledgesw.com/node/21 , це може бути подати заявку на D7
Jimajamma

Це дуже дивно. Це повідомлення виявляється рівно один раз у коді для core, відразу після перевірки на цю змінну (через 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

Крон семафор, ймовірно, заблокований. Ви можете спробувати зателефонувати на drupal_cron_cleanup () з будь-якого місця свого коду (до нього, можливо, не посилається cron), і це повинно розблокувати вашу змінну cma semaphore.

Якщо у Drupal 6 налаштовано друк, ви також можете спробувати:

$ drush vdel -y cron_semaphore

3
Або видаліть її вручну з таблиці змінних, якщо у вас є доступ db, а не натискання.
Малкс

8
Не забувайте, що ці значення зберігаються в таблиці cache_bootstrap.
tostinni

1
будь ласка, яка точна назва таблиці, тому що я не знайшов жодної cron_semaphore в таблиці змінних
mohammed amine bourkadi

2
Коли я запускаю команду drush вище, я отримую "cron_semaphore не знайдено". Будь-які ідеї?
Найджел Уотерс

1
@NigelWaters Семафор хронів став замком у Drupal 7, але, drupal_cron_cleanup()схоже, не оновлювався.
kiamlaluno

19

Підсумок

Повідомлення про помилку, яке ви бачите, трапиться, якщо будуть виконані дві наступні умови:

  • Ви не можете закінчити (помилка) або займати більше 4 хвилин;
  • Ви викликаєте cron частіше, ніж кожні 4 хвилини (Відповідно до налаштувань crontab, а не налаштування в Drupal)

Таким чином, це повідомлення про помилку є симптомом кронових завдань, які або не спрацьовують, або запускають занадто довго. (Примітка. Я розумію, що ви вже знайшли винуватця, але я хотів додати відповідь людям, які знайшли цю сторінку за допомогою пошуку, як і я)

Фон

Перше, що потрібно зрозуміти - це те, як виконуються завдання Drupal cron. Друпальний крон викликається через регулярні проміжки часу - або через роботу cron на вашому сервері, або після кожного завантаження сторінки, якщо ви використовуєте крон бідного чоловіка, який за замовчуванням Drupal.

Завдання cron не обов'язково виконуються щоразу, коли виклик cron є, але в Drupal є налаштування (за замовчуванням - 3 години), яке говорить про те, як часто потрібно виконувати завдання cron. Але ця затримка на 3 години застосовується лише за умови успішного виконання завдань Cron.

У Drupal 7, cron використовує замикаючі механізми Drupal , які забезпечують спільну, дорадчу систему блокування. Однією з особливостей цієї системи блокування є те, що замки закінчуються через певний час. У випадку з cron термін дії закінчується через 4 хвилини - тому, якщо ваш cron викликається кожні 3 хвилини, і попереднє завдання cron до цього часу не закінчилося (або воно зламалося, або було дуже повільним), ви дійсно отримаєте це повідомлення про помилку .

Те, що ви встановили крон на кожні 12 годин, не має ніякого значення - оскільки завдання для крона Drupal не працює / займає занадто довго, Drupal припускає, що його не виконували, тому намагається запустити його знову, як тільки виклик крона. Затримка на дванадцять годин стосується лише успішних кронових циклів.

Змінна семафора хронів більше не існує в Drupal 7 - це було для більш старої версії Drupal. У Drupal 7 немає надійного способу звільнення блокування вручну, тому що резервний сервер блокування може змінитися - однак, якщо ви використовуєте механізм блокування ядра, ви можете випустити блоки cron шляхом редагування бази даних:

DELETE FROM semaphore WHERE name = 'cron';

Але, роблячи це, ви б лише виправити симптоми - проблема, яка потребує вирішення, - це те, що крон не працює / займає так довго, щоб запустити.


Я отримую це повідомлення, але коли я запускаю cron_debug, усі завдання cron закінчуються успішно і запускаються швидко (крім основних оновлень, що займає ~ 5 секунд). Якщо джерелом цієї проблеми є повільні або невдалі підпрограми cron, чому б не вирішити їх cron_debug?
sum1ejack

1
Я не знаю, як працює модуль cron_debug, тому я не можу реально коментувати це. Яке значення змінної 'cron_safe_threshold'? Які дані є таблицею "семафор"?
Аліса Хітон

1
Це правильна відповідь для Drupal 7. +1 для детального пояснення.
kiamlaluno

BTW, якщо cron не спрацьовує, скористайтеся модулями налагодження Cron, щоб побачити, на який модуль він висить - 9 разів з 10 це модуль пошуку. Спробуйте вимкнути модуль пошуку, а потім запустіть cron вручну і подивіться, що відбувається. Щоб знайти вузли, які він намагається індексувати: drupal.stackexchange.com/questions/22825/…
Dan Mantyla

4

cron_semaphoreЗмінний Існуючий в Drupal 6, але ви використовуєте Drupal 7, так семафори замки переміщені в окрему таблицю з ім'ям semaphore.

Тож рішенням для розблокування серонного хрону було б:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Друпал 6

drush -y vdel cron_semaphore 

3
"Менш екстремальний" варіант для Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
таніум

2

Ви можете налагоджувати крон, використовуючи модуль налагодження Cron .

Налагодження Cron допоможе вам знайти кронні процеси, які

  • збій через помилки програмування або виконання
  • тайм-аут (PHP, сервер, база даних)
  • дуже повільні

Налагодження Cron також дозволить перевірити запуск конкретних функцій cron, не виконуючи інші. Це може бути приємно для розробки функцій cron, де ви не хочете запускати повний cron.php з усіма технічним обслуговуванням, сповіщеннями та іншими завданнями щоразу, коли ви перевіряєте власну функцію.


1
Цей модуль був для мене рятувальником життя!
Дан Мантіла

так, цей модуль хороший, він допомагає налагодити роботу cron.
Нішант

1

Ось як я вирішив проблему cron:

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


0

На Drupal 7, як навіть інший варіант,

Через drush cronя добирався,

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

Це було в середовищі розробки і сталося тому, що попередній крон працював і перервався.

У 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);
  }

І повторний крон. Це дозволить йому працювати.

Будь ласка, не розгортайте це та поверніть його назад після його закінчення. Це також допомагає при налагодженні.


-1

Я проти цього кілька разів зіштовхувався. У Drupal 6 Якщо ви не використовуєте барабан, ви можете виправити це так:

1 Видаліть змінні cron_% з таблиці змінних.

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

DELETE FROM variable WHERE name like "cron%";

2 очищення кеша Drupal за адресою: / admin / settings / performance

натиснувши кнопку "очистити кешовані дані" внизу сторінки.

3 запустіть cron з панелі адміністратора / admin / report / status / run-cron не запускайте його з командного рядка, оскільки це може спричинити проблеми.

4 Переконайтеся, що наступний автоматичний запуск крона завершився як звичайно.


Ласкаво просимо до відповідей Drupal! Питання стосується Drupal 7. Видалення рядків із таблиці таблиць баз даних не дасть особливого ефекту.
kiamlaluno

Так, я лише додав відповідь, оскільки конкретно не сказав, що це стосується Drupal 7 в ОП. Це добре працює для drupal 6 і є більш повним, ніж звичайні відповіді "видалити семафор". Я подумав, що це буде корисно, якщо хтось опинився тут із d6. Це було не так? Я, здається, був відзначений за це.
munkiepus

щойно оновлений, щоб видалити запущений крон із частини командного рядка, якраз з’ясував, що це може спричинити проблеми
munkiepus

-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.