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ć:
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.
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:
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ę.
tak, ten moduł jest dobry, pomaga debugować zadanie crona.
Nishant,
1
W ten sposób rozwiązałem problem CRON:
Przez PhpMyAdmin zajrzałem do tabeli semaforów i usunąłem wiersz gdzie name = cron
Uruchomiłem „drush cron” za pomocą wiersza poleceń
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
// 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.
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.
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.
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
Odpowiedzi:
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ć:
źródło
cache_bootstrap
.drupal_cron_cleanup()
wydaje się , że nie jest aktualizowany.Podsumowanie
Wyświetlany komunikat o błędzie może się pojawić, jeśli zostaną spełnione następujące dwa warunki:
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:
Ale robiąc to, naprawiałbyś tylko objawy - problemem, który wymaga rozwiązania, jest to, dlaczego cron zawodzi / zajmuje tak dużo czasu.
źródło
cron_semaphore
Zmienna istniał w Drupal 6, ale używasz Drupal 7, więc semafor zamki przeniesiony do osobnej tabeli o nazwiesemaphore
.Tak więc rozwiązaniem dla odblokowania semafora cron byłoby:
Drupal 7
Drupal 6
źródło
drush sql-query "DELETE FROM semaphore WHERE name='cron'"
Możesz debugować crona za pomocą modułu debugowania Cron .
źródło
W ten sposób rozwiązałem problem CRON:
name = cron
źródło
Dla Drupal 8: drush sqlq „USUŃ Z semafora GDZIE name = 'cron';”
źródło
Na Drupal 7, jako jeszcze jedna opcja,
Przez
drush cron
dostawałem,Działało to w środowisku programistycznym i stało się tak, ponieważ poprzedni cron działał i został przerwany.
W
includes/common.inc
linii 5413 lub w pobliżu znajduje się ten blok, https://cgit.drupalcode.org/drupal/tree/include/common.inc?h=7.x#n5413Zmodyfikuj
if
za pomocą&& FALSE
,I uruchom ponownie crona. To pozwoli mu działać.
Nie wdrażaj tego i przywróć po zakończeniu. Pomaga również w debugowaniu.
źródło
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.
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.
źródło
Możesz debugować za pomocą xdebug, uruchomić cron z interfejsu administratora Administrator> Konfiguracja> system> cron.
źródło