cron_schedule ueberwachen statt auf stille Ausfaelle zu hoffen
Ein Cron Job, der seit drei Tagen nicht mehr laeuft, faellt im Frontend meist nicht sofort auf, richtet aber genau in dieser Zeit stillen Schaden an. Systematisches Cron Monitoring und Alerting macht ausgebliebene und fehlgeschlagene Jobs sichtbar, bevor Kunden oder Umsatz darunter leiden.
Inhaltsverzeichnis
- 1. Warum Cron Ausfaelle so lange unbemerkt bleiben
- 2. cron_schedule als Datenquelle fuer Monitoring
- 3. Statuswerte richtig interpretieren
- 4. Eigener Health Check Indexer fuer Cron Status
- 5. Schwellenwerte fuer Alarme sinnvoll definieren
- 6. Anbindung an externe Alerting Systeme
- 7. Cron Logs systematisch auswerten
- 8. Dead Man Switch: den Watchdog selbst ueberwachen
- 9. Monitoring Ansaetze im Vergleich
- 10. Zusammenfassung
- 11. FAQ
1. Warum Cron Ausfaelle so lange unbemerkt bleiben
Ein ausgebliebener Cron Job zeigt sich selten sofort im Frontend. Bestellbestaetigungs Mails werden weiterhin verschickt, die Website laedt weiterhin, nur ein einzelner Hintergrundprozess, etwa ein Datenexport oder eine Preissynchronisation, laeuft schlicht nicht mehr. Genau diese Unauffaelligkeit macht Cron Monitoring und Alerting so wichtig: ohne aktive Ueberwachung bleibt ein still ausgefallener Job oft tagelang unentdeckt, bis jemand zufaellig eine veraltete Zahl bemerkt.
Die Ursachen fuer ausbleibende Cron Jobs sind vielfaeltig: ein deaktivierter Systemcron nach einem Serverumzug, ein PHP Fehler, der den gesamten Prozess abbrechen laesst, ein blockierender Lock durch einen haengenden Vorgaenger Job, oder schlicht ein Deployment, das den Cron Eintrag versehentlich entfernt hat. Ohne Cron Monitoring und Alerting unterscheidet sich keiner dieser Faelle von einem normal laufenden System, solange niemand aktiv nachschaut.
Gutes Cron Monitoring und Alerting bedeutet deshalb, die Verfuegbarkeit von Cron Jobs genauso ernst zu nehmen wie die Verfuegbarkeit der Website selbst, mit denselben Prinzipien: aktive Pruefung statt passivem Abwarten, klare Schwellenwerte statt Bauchgefuehl, und automatische Benachrichtigung statt manueller Kontrolle.
2. cron_schedule als Datenquelle fuer Monitoring
Die zentrale Datenquelle fuer jedes Cron Monitoring ist die Tabelle cron_schedule. Jede geplante Ausfuehrung eines Jobs erzeugt eine Zeile mit Job Code, geplanter Zeit, tatsaechlicher Ausfuehrungszeit, Status und im Fehlerfall einer Nachricht. Wer diese Tabelle regelmaessig auswertet, bekommt ohne zusaetzliche Infrastruktur einen verlaesslichen Ueberblick ueber den tatsaechlichen Zustand aller Cron Jobs.
-- Jobs that failed in the last 24 hours, grouped by job code
SELECT job_code, COUNT(*) AS failures, MAX(scheduled_at) AS last_failure
FROM cron_schedule
WHERE status = 'error'
AND scheduled_at > NOW() - INTERVAL 1 DAY
GROUP BY job_code
ORDER BY failures DESC;
-- Jobs that are stuck in "running" for longer than 30 minutes
SELECT job_code, scheduled_at, executed_at
FROM cron_schedule
WHERE status = 'running'
AND executed_at < NOW() - INTERVAL 30 MINUTE;
-- Detect a job code that has not run successfully in the last 6 hours
SELECT job_code, MAX(finished_at) AS last_success
FROM cron_schedule
WHERE status = 'success'
GROUP BY job_code
HAVING last_success < NOW() - INTERVAL 6 HOUR;
Diese drei Abfragen decken bereits die haeufigsten Faelle fuer Cron Monitoring und Alerting ab: wiederholt fehlgeschlagene Jobs, haengende Jobs mit Status "running", die nicht mehr weiterkommen, und Jobs, die seit unerwartet langer Zeit gar nicht mehr erfolgreich gelaufen sind. Ein Health Check Skript, das diese Abfragen periodisch ausfuehrt, bildet die Grundlage fuer alles Weitere.
3. Statuswerte richtig interpretieren
Die Statusspalte in cron_schedule kennt die Werte pending, running, success, error und missed. Fuer treffsicheres Cron Monitoring und Alerting ist besonders missed interessant: dieser Status wird gesetzt, wenn ein geplanter Job so lange nicht ausgefuehrt wurde, dass sein Zeitfenster (schedule_lifetime) bereits abgelaufen ist. Viele missed Eintraege innerhalb kurzer Zeit sind ein starkes Signal, dass der Systemcron selbst nicht mehr laeuft oder eine Cron Gruppe komplett blockiert ist.
Ein haeufiger Interpretationsfehler ist, ausschliesslich auf error zu achten und missed zu ignorieren. Ein Job, der schlicht nie gestartet wurde, erzeugt keinen Fehler im klassischen Sinne, sondern verschwindet stillschweigend im Status missed, ohne jemals PHP Code auszufuehren. Vollstaendiges Cron Monitoring und Alerting muss deshalb beide Statuswerte gleichermassen ueberwachen, nicht nur explizite Fehlermeldungen.
4. Eigener Health Check Indexer fuer Cron Status
Fuer strukturiertes Cron Monitoring und Alerting lohnt sich ein dedizierter Health Check Cron Job, der selbst regelmaessig prueft, ob andere kritische Jobs ihren erwarteten Zeitplan einhalten. Dieser Health Check laeuft idealerweise in seiner eigenen, isolierten Cron Gruppe, damit ein Ausfall des Hauptsystems ihn nicht gleich mit lahmlegt.
<?php
declare(strict_types=1);
namespace Vendor\Monitoring\Cron;
use Magento\Framework\App\ResourceConnection;
use Psr\Log\LoggerInterface;
/**
* Watchdog cron job that inspects cron_schedule for jobs missing their
* expected execution window and reports critical failures via logger.
*/
class CronHealthCheck
{
/** @var array<string,int> Job code to maximum allowed silence in minutes. */
private const WATCHED_JOBS = [
'vendor_sync_products' => 45,
'vendor_order_export' => 20,
'catalog_product_price' => 120,
];
/**
* @param ResourceConnection $resourceConnection Direct DB access to cron_schedule.
* @param LoggerInterface $logger Emits alerts consumed by external monitoring.
*/
public function __construct(
private readonly ResourceConnection $resourceConnection,
private readonly LoggerInterface $logger
) {
}
/**
* Checks each watched job for staleness and logs a critical alert if breached.
*
* @return void
*/
public function execute(): void
{
$connection = $this->resourceConnection->getConnection();
$table = $this->resourceConnection->getTableName('cron_schedule');
foreach (self::WATCHED_JOBS as $jobCode => $maxSilenceMinutes) {
$select = $connection->select()
->from($table, ['finished_at'])
->where('job_code = ?', $jobCode)
->where('status = ?', 'success')
->order('finished_at DESC')
->limit(1);
$lastSuccess = $connection->fetchOne($select);
$silentMinutes = $lastSuccess
? (time() - strtotime((string) $lastSuccess)) / 60
: PHP_INT_MAX;
if ($silentMinutes > $maxSilenceMinutes) {
$this->logger->critical(sprintf(
'Cron job "%s" has not succeeded in %.0f minutes (limit: %d)',
$jobCode,
$silentMinutes,
$maxSilenceMinutes
));
}
}
}
}
Dieser Health Check ist selbst nur ein weiterer Cron Job, deshalb sollte er in einer eigenen Gruppe mit hoher Prioritaet laufen. Sein Zweck ist ausschliesslich Beobachtung, keine eigentliche Geschaeftslogik, was ihn zusaetzlich robust macht, weil er selbst kaum Fehlerquellen mitbringt.
5. Schwellenwerte fuer Alarme sinnvoll definieren
Der Erfolg von Cron Monitoring und Alerting haengt massgeblich davon ab, wie realistisch die Schwellenwerte gewaehlt sind. Ein Job, der planmaessig alle 15 Minuten laeuft, sollte nach etwa 45 Minuten Stille einen Alarm ausloesen, nicht erst nach mehreren Stunden. Ein Job, der planmaessig einmal taeglich laeuft, braucht dagegen einen deutlich groesszuegigeren Schwellenwert, sonst entstehen Fehlalarme, die das Team abstumpfen lassen und echte Probleme im Rauschen untergehen.
Eine bewaehrte Faustregel fuer Cron Monitoring und Alerting ist, den Schwellenwert bei etwa dem Zwei bis Dreifachen des regulaeren Intervalls anzusetzen. Ein alle 15 Minuten laufender Job bekommt damit ein Zeitfenster von 30 bis 45 Minuten, bevor ein Alarm ausgeloest wird, was normale Verzoegerungen durch Systemlast toleriert, aber echte Ausfaelle zuverlaessig erkennt.
6. Anbindung an externe Alerting Systeme
Ein Log Eintrag mit Level critical nuetzt wenig, wenn niemand die Log Datei liest. Fuer produktionsreifes Cron Monitoring und Alerting muss die Erkennung an ein aktives Benachrichtigungssystem angebunden werden, etwa ueber einen dedizierten Monolog Handler, der kritische Log Eintraege an Slack, E-Mail oder ein PagerDuty aehnliches System weiterleitet.
<?xml version="1.0"?>
<!-- app/code/Vendor/Monitoring/etc/crontab.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
<group id="vendor_monitoring_group">
<job name="vendor_cron_health_check" instance="Vendor\Monitoring\Cron\CronHealthCheck" method="execute">
<!-- Every 10 minutes, independent from monitored jobs -->
<schedule>*/10 * * * *</schedule>
</job>
</group>
</config>
Die Wahl des Alerting Kanals fuer Cron Monitoring und Alerting haengt von der Reaktionszeit ab, die tatsaechlich erwartet wird. E-Mail eignet sich fuer weniger dringende Warnungen, ein Chat Kanal wie Slack fuer taeglich relevante Hinweise, und ein dediziertes Incident System fuer geschaeftskritische Ausfaelle, die eine sofortige Reaktion ausserhalb der Geschaeftszeiten erfordern.
7. Cron Logs systematisch auswerten
Neben der Datenbanktabelle liefert auch die Standard Log Ausgabe von Magento wertvolle Informationen fuer Cron Monitoring und Alerting. Fehler innerhalb eines Cron Jobs, die eine Exception werfen, landen typischerweise in var/log/exception.log, waehrend allgemeine Cron Aktivitaet in var/log/system.log protokolliert wird, sofern das entsprechende Logging aktiviert ist.
Eine sinnvolle Ergaenzung zur reinen cron_schedule Auswertung ist ein periodischer Scan dieser Log Dateien nach bestimmten Mustern, etwa wiederholten Exceptions desselben Typs innerhalb kurzer Zeit. Das Cron Monitoring und Alerting gewinnt dadurch eine zweite, unabhaengige Datenquelle, die auch Faelle erfasst, in denen ein Job zwar als "success" markiert wird, aber intern bereits Warnungen protokolliert hat, die auf ein sich anbahnendes Problem hindeuten.
8. Dead Man Switch: den Watchdog selbst ueberwachen
Ein oft uebersehener blinder Fleck bei Cron Monitoring und Alerting ist die Frage, wer den Watchdog selbst ueberwacht. Faellt der Systemcron komplett aus, laeuft auch der Health Check Job nicht mehr, und das Monitoring System meldet in diesem Fall gar nichts, weil es selbst nicht mehr ausgefuehrt wird. Die Loesung ist ein externer Dead Man Switch: ein aussenstehender Dienst, der erwartet, in regelmaessigen Abstaenden ein Signal vom Health Check Job zu empfangen, und selbst Alarm schlaegt, wenn dieses Signal ausbleibt.
Praktisch umgesetzt bedeutet das, dass der Health Check Job bei jedem erfolgreichen Lauf einen HTTP Request an einen externen Endpunkt, etwa einen Heartbeat Dienst, sendet. Bleibt dieser Heartbeat innerhalb eines definierten Zeitfensters aus, schlaegt der externe Dienst unabhaengig vom internen Zustand des Shops Alarm. Diese Umkehrung der Ueberwachungsrichtung ist der einzige verlaessliche Weg, einen vollstaendigen Ausfall des Cron Systems selbst zu erkennen, statt sich ausschliesslich auf interne Mechanismen zu verlassen.
9. Monitoring Ansaetze im Vergleich
Je nach Reifegrad des Betriebs eignen sich unterschiedliche Kombinationen von Cron Monitoring und Alerting Techniken.
| Ansatz | Erkennt fehlgeschlagene Jobs | Erkennt ausgebliebene Jobs | Erkennt Totalausfall des Cron Systems |
|---|---|---|---|
| cron_schedule manuell pruefen | Ja, aber nicht automatisch | Ja, aber nicht automatisch | Nein |
| Interner Health Check Job | Ja | Ja | Nein |
| Log Scan | Ja | Teilweise | Nein |
| Externer Dead Man Switch | Indirekt | Indirekt | Ja |
Vollstaendiges Cron Monitoring und Alerting kombiniert alle vier Ebenen: interne cron_schedule Auswertung fuer Detailinformationen, einen Health Check Job fuer aktive Ueberwachung kritischer Jobs, Log Scans fuer zusaetzlichen Kontext, und einen externen Dead Man Switch als letzte Absicherung gegen den kompletten Ausfall des Cron Systems selbst. Nur diese Kombination deckt alle realistischen Ausfallszenarien ab.
Mironsoft
Magento 2 Betriebssicherheit und Monitoring
Wisst ihr sofort, wenn ein kritischer Cron Job ausfaellt?
Wir richten Health Check Jobs, Schwellenwert Alarme und externe Dead Man Switches fuer eure Magento Cron Landschaft ein, damit ausgebliebene oder fehlgeschlagene Jobs euch erreichen, bevor Kunden sie bemerken.
Monitoring Setup
Health Check Jobs und realistische Schwellenwerte fuer eure kritischen Prozesse
Alerting Integration
Anbindung an Slack, E-Mail oder Incident Systeme nach euren Praeferenzen
Dead Man Switch
Absicherung gegen den Totalausfall des Cron Systems selbst
10. Zusammenfassung
Wirksames Cron Monitoring und Alerting in Magento 2 basiert auf mehreren zusammenwirkenden Ebenen: einer systematischen Auswertung von cron_schedule, einem dedizierten Health Check Job mit realistischen Schwellenwerten, einer Anbindung an ein aktives Benachrichtigungssystem und einem externen Dead Man Switch, der auch den vollstaendigen Ausfall des Cron Systems selbst erkennt.
Der wichtigste Perspektivwechsel ist, Cron Jobs als genauso ueberwachungswuerdig zu behandeln wie die Website selbst. Wer Cron Monitoring und Alerting als festen Bestandteil des Betriebskonzepts etabliert, erfaehrt von Ausfaellen innerhalb von Minuten statt erst dann, wenn ein Kunde eine veraltete Zahl oder eine ausgebliebene Bestaetigung meldet.
Cron Monitoring und Alerting in Magento 2, das Wichtigste auf einen Blick
Datenquelle
cron_schedule systematisch nach fehlgeschlagenen, haengenden und ausgebliebenen Jobs auswerten.
Health Check
Dedizierter Cron Job in eigener Gruppe, der kritische Jobs auf Stille prueft und Alarme protokolliert.
Alerting
Anbindung an Slack, E-Mail oder Incident System, Schwellenwerte am Zwei bis Dreifachen des Intervalls.
Dead Man Switch
Externer Heartbeat Dienst erkennt Totalausfall des Cron Systems, den internes Monitoring nicht sehen kann.