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.