Drupals Cron.php hängt - Fehlersuche mit Elysia Cron

Drupals Cron.php hängt - Fehlersuche mit Elysia Cron

Manchmal kann es passieren, dass Drupals Cron.php nicht ordnungsgemäß ausgeführt wird und einfach abbricht. Häufig sind zu geringe Einstellungen für das PHP-Speicherlimit oder die Skript-Laufzeit die Ursache. Letztens hatten wir allerdings einen Fall, der sich als sehr hartnäckig erwies. Nach dem Umzug einer neu entwickelten Webseite von unserem Entwicklungsserver auf den den Kundenserver, lief cron.php plötzlich nicht mehr. In der Log-Datei stand lediglich der lapidare Hinweis, dass Cron wegen Zeitüberschreitung abgebrochen wurde. Ein manuelles Ausführen über die Drupal-Statusseite (..//admin/reports/status) brachte dann diese Fehlermeldung:

PHP Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes) in file on line x.

Also das Übliche, wenn das PHP-Speicherlimit zu niedrig ist. Allerdings stand dies bereits auf 256 MB (ein Wert mit dem die Seite bisher tadellos lief). Nachdem sich der Support das Ganze angeschaut hatte, kam die Empfehlung den Wert auf 1024 MB hochzusetzen. Was leider auch nicht half.

Ach ja, wenn ein Cron "hängt", läßt Drupal keinen Neustart zu, bis Drupals eigenes Zeitlimit abgelaufen ist. Will man solange nicht warten, muss man zwei Einträge in der Tabelle "variable" löschen. Diese geht entweder per SQL (z.B. via phpmyadmin)

<br />
USE Name_der_Drupal_Datenbank;<br />
DELETE FROM variable WHERE name="cron_semaphore";<br />
DELETE FROM variable WHERE name="cron_last";<br />

oder mit Drush (das ist die bequemste Variante, weil man via Drush z.B. auch cron.php aufrufen kann)

<br />
drush vdel cron_semaphore<br />
drush vdel cron_last<br />

Anschließend kann man cron.php erneut aufrufen.

Zunächst gilt es aber erstmal die Ursache des Absturzes zu finden. Hierbei kommt Elysia-Cron ins Spiel. Dieses Modul bietet sehr viel mehr Möglichkeiten, als Poormanscron und erlaubt z.B. jedes Modul, das einen Cron-Hook bereitstellt, einzeln aufzurufen. Und genau das nutzen wir, um das Modul zu identifizieren, dass für den Abbruch verantwortlich ist. Dazu als erstes Elysia-Cron installieren und aktivieren. Anschließend geht man auf die Settings-Seite des Module (../admin/build/cron). Dort findet man eine Übersicht aller Module die Cron-Hooks bereitstellen. Das sieht dann ungefähr so aus:

Settings-Seite von Elysia-Cron

Jetzt kann man jeden Cron-Hook einzeln aufrufen. Das haben wir gemacht und wurden schließlich bei Notify fündig. Notify soll Benachrichtigungs-Emails verschicken, wenn auf der Seite Inhalte geändert wurden. Aus irgendeinem Grund verursachte dieses Modul den hohen Speicherverbrauch, wenn sein Cron abgearbeitet werden sollte. Das Problem ließ sich durch Deinstallation und Neuinstallation lösen. Dabei werden die Datenbanktabellen neu angelegt - offenbar war eine defekte Tabelle oder korrupte Einträge die Ursache für das Maleur. Aber auch wer keine derartigen Cron-Probleme hat, sollte sich Elysia-Cron einmal anschauen. Die Möglichkeit verschiedene Cron-Tasks zu unterschiedlichen Zeiten laufen zu lassen, ist z.B. interessant, wenn man einige wenige Aufgaben in sehr kurzen Intervallen laufen lassen will, andere dagegen nur einmal am Tag - bspw. in lastschwachen Zeiten.