wget und administrative cronjobs

Wer – so wie ich – gerne seine CRON-Tabelle mit Hintergrund-Jobs füllt, die der Server beispielsweise ein mal pro Tag erledigen soll, der sollte gerade in der Kombination wget und PHP-Script etwas aufpassen. Es gibt da einen Fallstrick, der nicht auf den ersten Blick sichtbar ist:

Angenommen, das PHP-Script braucht etwas länger. Und genau das ist ja in der Regel der Fall. Dazu legt man solche Aufgaben in den Hintergrund.

WGET fängt also an, die PHP-Seite abzurufen – und wartet, und wartet, und wartet… Das macht es 900 Sekunden, also 15 Minuten lang. Wenn das Script dann noch nicht fertig ist, dann gibt wget auf zu warten. Und hier kommt der Haken: Es hört dann nicht auf, sondern es versucht es gleich noch mal. Standardmäßig 20 mal.

Wozu das führt ist relativ klar: Es läuft jetzt ein weiterer Prozess, der noch mal das gleiche tut wie der erste Prozess. Der bremst in der Regel den ersten Prozess noch weiter aus und läuft selbst auch langsamer, da er mit dem ersten Prozess konkurriert. Nach 15 Minuten kommt dann der nächste Prozess dazu, alles wird noch langsamer, …

Deshalb immer dafür Sorgen, dass es nur einen einzigen Versuch gibt:
wget --tries=1 --spider http://www.example.com/cronjob.php

Oder alternativ:
curl http://www.example.com/cronjob.php

cURL setzt standardmäßig auf „Nicht wieder Versuchen„.