Kategorien
Optimierung

Cronjobs auf dem Webserver einrichten

Gibt es im Zusammenhang mit Deiner Internetseite bestimmte Tätigkeiten, die Du zeitgesteuert und automatisch ausführen lassen möchtest? Ohne dass Du Dich darum bei jeder Gelegenheit selbst kümmern musst? Eine Auswahl solche chronologisch wiederkehrender Aufgaben habe ich bereits in einem allgemeinen Beitrag über sogenannte Cronjobs vorgestellt: Hintergrundverarbeitung mit Cronjobs.

Wie man solche Cronjobs auf dem angemieteten Webserver einrichtet, erkläre ich nun in diesem Beitrag.

Dabei gehe ich davon aus, dass Du weißt, wie Du Dich mit einem Secure-Shell-Pro­gramm wie PuTTY mit Deinem Webserver verbindest. Was dazu nötig ist, findest Du detailliert beschrieben im vorhergehenden Beitrag. Du hast Dich also mit Deiner FTP-Be­nut­zer­ken­nung und dem passenden Kennwort im Programm PuTTY mit Deinem Webserver verbunden.

Mit dem Kommando crontab -e öffnest Du die Tabelle Deiner existierenden Cronjobs oder legst eine neue Datei Crontab an. Mit dem vi-Kom­man­do i startest Du den Eingabemodus (siehe Details dazu im vorhergehenden Beitrag). In der ersten Zeile dieser Datei sollte sicherheitshalber eine E-Mail­adres­se angegeben werden, an die Fehlermeldungen verschickt werden können:

MAILTO=ich@meinpostfach.de

Danach folgen eine oder mehrere Zeile mit Kommandos, die zu bestimmten Zeitpunkten ausgeführt werden sollen. Ich gebe einmal ein Beispiel, damit Du siehst, wie so ein Eintrag aussehen sollte:

10 0 * * * /usr/bin/php /mnt/rid/6/78/12345678/htdocs/meindir/daily.php

Keine Panik, ich erkläre sofort, was diese kryptische Zeile bedeutet:

  • Am Zeilenanfang stehen fünf Ziffern oder Sternchen, die den Ausführungszeitpunkt definieren.
  • Danach folgt das Programm, das ausgeführt werden soll, also in diesem Beispiel PHP.
  • Der letzte Block ist die Serveradresse des PHP-Scripts, das ablaufen soll.

Ausführungszeitpunkt

Der Ausführungszeitpunkt wird durch fünf Parameter bestimmt, die jeweils am Zeilenanfang stehen:

  1. Die erste Angabe bezieht sich auf die Minute, in der die Verarbeitung beginnen soll. „10“ bedeutet also: um zehn Minuten nach.
    (Mögliche Werte: 0 bis 59)
  2. Die zweite Angabe ist die Stunde, in der die Verarbeitung stattfinden soll. „0“ bedeutet also: null Uhr.
    (Mögliche Werte: 0 bis 23)
  3. Der dritte Parameter ist das Tagesdatum, an dem verarbeitet werden soll: „1“ wäre also der erste in jedem Monat, „15“ der fünfzehnte.
    (Mögliche Werte: 1 bis 31)
  4. An vierter Stelle folgt der Monat, in dem die Verarbeitung stattfinden soll. „1“ wäre also der Januar.
    (Mögliche Werte: 1 bis 12)
  5. An letzer Stelle folgt der Wochentag, an dem das Kommando ausgeführt wird. „0“ steht für den Sonntag, „6“ für den Samstag.
    (Mögliche Werte: 0 bis 6)

Soll eine der Angaben egal sein, fügt man ein Sternchen ein. Das Beispiel oben 10 0 * * * bedeutet also: täglich um 0:10 Uhr. Mehrere gewünschte Ausführungszeitangaben kann man durch Kommas trennen. 55 11 1,8,15,22,29 * * wäre nach dieser Logik also jeder 1., 8., 15., 22. und 29. eines jeden Monats, jeweils um fünf vor zwölf.

Weitere Beispiel:
  • 0 1 15 * * steht für monatlich an jedem 15. um 1 Uhr nachts.
  • 5 2,3,4 * * 0 wäre jeder Sonntag und zwar um fünf nach 2, fünf nach 3 und 5 nach 4 Uhr.
  • 0 18 24 12 * bedeutet jedes Jahr zu Weihnachten um sechs Uhr abends.

Wie sinnvoll solche Angaben sind, muss man sich natürlich selbst klar machen. Ein Sternchen an erster Stelle würde minütliche Ausführung provozieren. Ich kann mir kein Beispiel vorstellen, in dem eine solche Frequenz sinnvoll sein könnte.

Auszuführendes Programm

Hier kann jeder Befel stehen, den der Webserver versteht. In meinem Beispiel möchte ich gerne ein PHP-Script ausführen lassen. Also heißt das Programm /usr/bin/php, das das Script aufruft und abarbeitet.

Man sollte unbedingt mit seinem Webhoster klären, welche Programme ausgeführt werden können und sollen. Bei manchen Anbietern kann (oder muss) man sogar die PHP-Version angeben, die ausgeführt werden soll, oder einen Zusatz für die Com­mand-Line-Aus­füh­rung: /usr/bin/php8.1-cli

Auszuführendes Script

Als letztes Element der Zeile folgt noch der Dateiname des PHP-Scripts, das abgearbeitet werden soll. Dieser Dateiname muss der vollständige Pfadname sein, unter dem die Datei abgelegt ist. Diesen Dateipfad findet man im Kundenbereich des Webhosters. In meinem Beispiel habe ich eine erfundene Pfadangabe verwendet, die dem Namensschema des Anbieters Strato entspricht.

Zusätzliche Parameter

In meinem Beispiel wird das angegebene PHP-Script also täglich um 0:10 Uhr abgearbeitet. Falls dabei ein Fehler auftreten sollte, würde eine Nachricht an die MAILTO-Adresse verschickt. Mit diesem Fehlermechanismus bin ich allerdings nicht zufrieden. Deshalb geben meine PHP-Scripte stets Anfangs-, Zwischen, und Endmeldungen aus, damit ich nachsehen kann, was überhaupt gemacht wurde.

Fragst Du Dich, wo ich das nachsehen will? Die Antwort lautet: Man kann in der Crontab zusätzlich angeben, wohin Ausgaben geschrieben werden sollen. Das erreicht man durch folgende Ergänzung in jeder Zeile der Crontab:

10 0 * * * /usr/bin/php /mnt/rid/6/78/12345678/htdocs/meindir/daily.php >> /mnt/rid/6/78/12345678/htdocs/meindir/cronjob.log 2>&1

Das Beispielscript daily.php wird also jede Nacht ausgeführt und alle Programmausgaben an die Datei cronjob.log im gleichen Verzeichnis auf dem Webserver angehängt. (Das Anhängen besorgt der Doppelpfeil >>.) Außerdem werden alle Fehlermeldung ebenfalls an diese Datei angehängt (2>&1). Dadurch wird die Angabe der Mailadresse bedeutungslos, da keine Nachrichten verschickt werden.

Aber Achtung: Die Datei cronjob.log wird jede Nacht ein Stückchen größer. Man sollte also tunlichst durch eine weiteres Script dafür sorgen, dass der Inhalt der Logdatei regelmäßig gelöscht oder anderweitig gesichert wird. Sonst läuft der Webspace irgendwann über. (Es gibt bei allen Webhostern Grenzen für die Dateigröße.)

***

PHP-Beispiel

Bist Du jetzt enttäuscht, weil Du nicht weißt, was in dieser PHP-Datei steht, die da womöglich jeden Tag ausgeführt wird? Nun, das hier ist ja auch kein Programmierkurs. Aber ich will ein kurzes Beispiel anführen, damit Du eine Ahnung bekommst, wie man das macht.

1. Schritt: PHP-Code schreiben

Wir legen eine Datei mit dem Namen winterheader.php in einem geeigeneten Serververzeichnis an: /mnt/rid/6/78/12345678/htdocs/scripte/winterheader.php:

<?php
	define( "SERVER_ROOT_PATH", realpath( ".." ) );
	define( "WP_IMG_PATH", SERVER_ROOT_PATH . "/wp-content/uploads/2023/05/" );
	copy( WP_IMG_PATH . 'winter.jpg', WP_IMG_PATH . 'header.jpg' );
?>

Diese PHP-Script ersetzt die Grafikdatei header.jpg durch die Datei winter.jpg. Nehmen wir an, dass die Datei header.jpg ein Bild enthält, das auf Deiner Website über die ganze Seitenbreite angezeigt wird. Nehmen wir weiter an, Du lässt das Script jedes Jahr am 20. November ausführen.

2. Schritt: Ausführung in der Crontab festlegen
59 1 20 11 * /usr/bin/php /mnt/rid/6/78/12345678/htdocs/scripte/winterheader.php

Dann wird jedes Jahr im November das Headerbild auf Deiner Website durch ein Winterbild ersetzt. Wenn Du dann noch jeden April ein weiteres Script ausführen lässt, dass das Winterfoto durch ein Sommerbild ersetzt, hast Du eine automatische Jahreszeitanpassung Deiner Internetseite programmiert und brauchst Dich nie wieder darum kümmern.

Von Ulf Brossmann

Betreiber von und Autor der Beiträge auf WordPress fassbar. Eine Kurzbiografie von Ulf findest Du am unteren Ende der Seite über diese Website. Hier folgen nun alle Artikel, die Ulf bisher verfasst hat, in umgekehrt chronologischer Reihenfolge, also der neuste zuoberst:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert