Cron przestał biec; logi mówią: „Próba ponownego uruchomienia crona, gdy już działa.”

11

Jakie są kroki w celu rozwiązania i rozwiązania tego problemu według tytułu?

Gdy próbuję uruchomić ręcznie, natychmiast pojawia się strona i komunikat o błędzie „Próba ponownego uruchomienia crona, gdy jest on już uruchomiony”.

giorgio79
źródło
Nie mogłem sobie przypomnieć, co wygląda w db cron, ale szybkie google „próby ponownego uruchomienia crona, gdy już działa”, wskazało mi na digitaledgesw.com/node/21 , może to stosuje się do D7
Jimajamma,
To bardzo dziwne. Ten komunikat znajduje się dokładnie raz w kodzie rdzenia, zaraz po sprawdzeniu tej zmiennej (poprzez lock_acquire w drupal_cron_run). Jeśli opublikujesz więcej informacji / symptomów wskazujących, że rzeczywiście jest inaczej, otworzę je ponownie.
mpdonadio
Sugestia: czy możesz spróbować zainstalować świeżego Drupala i ustawić crona, aby uruchamiał się co 3 minuty i sprawdzał, czy masz ten sam efekt !!!
Aboodred1,
Wystarczy uruchomić:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb
4
NA PRZYSZŁOŚĆ CZYTELNIKÓW: Aktualnie akceptowana odpowiedź jest nieprawidłowa dla Drupala 7, wersji Drupala, dla której pytanie jest zadane. Jest ważny dla Drupal 6, ale kod Drupal 7 został zmieniony; po prostu zdarza się, że Drupal 7 ma resztki z Drupala 6, które nie zostały oczyszczone.
kiamlaluno

Odpowiedzi:

12

Semafor cron jest prawdopodobnie zablokowany. Możesz spróbować wywołać funkcję drupal_cron_cleanup () z dowolnego miejsca w kodzie (co nie jest wywoływane przez cron) i powinno to odblokować twoją zmienną semaforową cron.

Jeśli masz Drusha skonfigurowanego w Drupal 6, możesz także spróbować:

$ drush vdel -y cron_semaphore
amator barista
źródło
3
Lub usuń go ręcznie z tabeli zmiennych, jeśli masz dostęp do bazy danych zamiast drush.
Malks
8
Nie zapominaj, że te wartości są buforowane w tabeli cache_bootstrap.
tostinni
1
proszę, jaka jest dokładna nazwa tabeli, ponieważ nie znalazłem żadnego cron_semaphore w tabeli zmiennych
mohammed amine bourkadi 11.03.2013
2
Kiedy uruchomię powyższe polecenie drush, pojawia się komunikat „Nie znaleziono pliku cron_semaphore”. Jakieś pomysły?
Nigel Waters,
1
@NigelWaters Semafor cron stał się zamkiem w Drupal 7, ale drupal_cron_cleanup()wydaje się , że nie jest aktualizowany.
kiamlaluno
19

Podsumowanie

Wyświetlany komunikat o błędzie może się pojawić, jeśli zostaną spełnione następujące dwa warunki:

  • Zadania crona nie kończą się (błąd) lub nie trwają dłużej niż 4 minuty;
  • Wywołujesz crona częściej niż co 4 minuty (zgodnie z ustawieniem crontab, a nie w Drupal)

Ten komunikat o błędzie jest zatem objawem zadań CRON, które kończą się niepowodzeniem lub trwają zbyt długo. (Uwaga: zdaję sobie sprawę, że już znalazłeś winowajcę, ale chciałem dodać odpowiedź dla osób, które znajdują tę stronę za pomocą wyszukiwań, tak jak ja)

tło

Pierwszą rzeczą do zrozumienia jest sposób uruchamiania zadań cron Drupal. Drupal cron jest wywoływany w regularnych odstępach czasu - albo przez zadanie cron na twoim serwerze, albo po każdym załadowaniu strony, jeśli używasz crona biednego człowieka, który jest domyślnym Drupalem.

Jednak zadania cron niekoniecznie są uruchamiane za każdym razem, gdy cron jest wywoływany - w Drupal jest ustawienie (domyślnie 3 godziny), które określa, jak często zadania cron powinny być uruchamiane. Ale to 3-godzinne opóźnienie ma zastosowanie tylko wtedy, gdy zadania crona zakończyły się pomyślnie.

W Drupal 7 cron wykorzystuje mechanizmy blokujące Drupala , które zapewniają współpracujący, doradczy system blokowania. Jedną z cech tego systemu zamków jest to, że zamki wygasają po pewnym czasie. W przypadku crona wygasa po 4 minutach - więc jeśli twój cron jest wywoływany co 3 minuty, a poprzednie zadanie crona nie zakończyło się do tego czasu (albo się zawiesiło, albo działało bardzo wolno), rzeczywiście pojawiłby się ten komunikat o błędzie .

Fakt, że ustawiasz crona co 12 godzin, nie robi różnicy - ponieważ zadanie cron Drupala kończy się niepowodzeniem / trwa zbyt długo, Drupal zakłada, że ​​nie zostało uruchomione, więc próbuje uruchomić go ponownie, gdy tylko cron zostanie wywołany. Dwunastogodzinne opóźnienie dotyczy tylko udanych testów cron.

Zmienna semafora cron już nie istnieje w Drupal 7 - dotyczyło to starszej wersji Drupala. W Drupal 7 nie ma niezawodnego sposobu ręcznego zwolnienia blokady, ponieważ backend blokujący może się zmienić - jednak jeśli używasz podstawowego mechanizmu blokującego, możesz zwolnić blokady cron, edytując bazę danych:

DELETE FROM semaphore WHERE name = 'cron';

Ale robiąc to, naprawiałbyś tylko objawy - problemem, który wymaga rozwiązania, jest to, dlaczego cron zawodzi / zajmuje tak dużo czasu.

Alice Heaton
źródło
Otrzymuję ten komunikat, ale kiedy uruchamiam cron_debug, wszystkie zadania cron kończą się pomyślnie i działają szybko (z wyjątkiem podstawowych aktualizacji, które trwają ~ 5 sekund). Jeśli źródłem tego problemu są powolne lub niedziałające procedury cron, dlaczego cron_debug nie podświetli ich?
doub1ejack
1
Nie wiem, jak działa moduł cron_debug, więc nie mogę tego komentować. Jaka jest wartość zmiennej „cron_safe_threshold”? Jakie dane to tabela „semaforowa”?
Alice Heaton,
1
To jest poprawna odpowiedź dla Drupala 7. +1 dla szczegółowego wyjaśnienia.
kiamlaluno
BTW, jeśli cron zawiedzie, użyj modułów debugowania Cron, aby zobaczyć, na którym module się rozłącza - 9 razy na 10 to moduł wyszukiwania. Spróbuj wyłączyć moduł wyszukiwania, a następnie ręcznie uruchom cron i zobacz, co się stanie. Aby znaleźć węzły, które próbuje zaindeksować: drupal.stackexchange.com/questions/22825/…
Dan
4

cron_semaphoreZmienna istniał w Drupal 6, ale używasz Drupal 7, więc semafor zamki przeniesiony do osobnej tabeli o nazwie semaphore.

Tak więc rozwiązaniem dla odblokowania semafora cron byłoby:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
kenorb
źródło
3
„Mniej ekstremalny” wariant dla Drupala 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius
2

Możesz debugować crona za pomocą modułu debugowania Cron .

Debata Crona pomoże ci znaleźć procesy cron, które

  • nie powiodło się z powodu błędów programowania lub czasu wykonywania
  • limit czasu (PHP, serwer, baza danych)
  • są bardzo wolne

Debata Crona pozwoli ci również przetestować uruchamianie określonych funkcji crona, podczas gdy inne nie są uruchamiane. Może to być przydatne do tworzenia funkcji crona, w których nie chcesz uruchamiać pełnego pliku cron.php ze wszystkimi czynnościami konserwacyjnymi, alertami i innymi zadaniami za każdym razem, gdy testujesz własną funkcję.

Nishant
źródło
1
Ten moduł był dla mnie ratunkiem!
Dan Mantyla,
tak, ten moduł jest dobry, pomaga debugować zadanie crona.
Nishant,
1

W ten sposób rozwiązałem problem CRON:

  1. Przez PhpMyAdmin zajrzałem do tabeli semaforów i usunąłem wiersz gdzie name = cron
  2. Uruchomiłem „drush cron” za pomocą wiersza poleceń
  3. Zobaczyłem komunikat o błędzie, który dał mi wskazówkę dotyczącą problemu; może to być inne dla ciebie, ale dla mnie niedawno odinstalowany moduł, który współużytkuje bibliotekę PHP z zainstalowanym modułem, powodował błąd
albertski
źródło
0

Dla Drupal 8: drush sqlq „USUŃ Z semafora GDZIE name = 'cron';”

Diana
źródło
0

Na Drupal 7, jako jeszcze jedna opcja,

Przez drush crondostawałem,

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

Działało to w środowisku programistycznym i stało się tak, ponieważ poprzedni cron działał i został przerwany.

W includes/common.inclinii 5413 lub w pobliżu znajduje się ten blok, https://cgit.drupalcode.org/drupal/tree/include/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);
  }

Zmodyfikuj ifza pomocą && 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);
  }

I uruchom ponownie crona. To pozwoli mu działać.

Nie wdrażaj tego i przywróć po zakończeniu. Pomaga również w debugowaniu.

rovr138
źródło
-1

Spotkałem się z tym kilka razy. W Drupal 6 Jeśli nie używasz drusha, możesz to naprawić w następujący sposób:

1 Usuń zmienne cron_% z tabeli zmiennych.

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

DELETE FROM variable WHERE name like "cron%";

2 wyczyść pamięć podręczną Drupal na: / admin / settings / performance

naciskając przycisk „wyczyść dane z pamięci podręcznej” u dołu strony.

3 uruchom crona z panelu administracyjnego / admin / raporty / status / run-cron nie uruchamiaj go z linii poleceń, ponieważ może to powodować problemy.

4 Sprawdź, czy następny automatyczny przebieg cron zakończy się normalnie.

Munkiepus
źródło
Witamy w Drupal Answers! Pytanie dotyczy Drupala 7. Usunięcie wierszy z tej tabeli bazy danych nie miałoby większego efektu.
kiamlaluno
Ach, dodałem tylko odpowiedź, ponieważ nie powiedziałem konkretnie, że dotyczy to Drupala 7 w PO. Działa to dobrze dla drupala 6 i jest bardziej kompletne niż zwykłe odpowiedzi „usuń semafor”. Pomyślałem, że byłoby pomocne, gdyby ktoś skończył tutaj z d6. Czy to źle? Wydaje mi się, że zostałem do tego przeznaczony.
Munkiepus
właśnie zaktualizowano, aby usunąć uruchamiający cron z części wiersza poleceń, właśnie się dowiedziałem, że może powodować problemy
Munkiepus
-1

Możesz debugować za pomocą xdebug, uruchomić cron z interfejsu administratora Administrator> Konfiguracja> system> cron.

Abdulla Abu Zakham
źródło