In diesem Artikel erfahren Sie, wie Sie auf Ihrem Virtual Server Managed oder WebServer einen Cronjob einrichten können und welche Möglichkeiten Ihnen Cronjobs bieten.
Inhalt
- Was ist ein Cronjob?
- Voraussetzungen
- Konfiguration im KIS
- Erweiterte Beispiele
- Häufige Fehlerquellen
- Vorgefertigte Cronjobs
- Parallel laufende Jobs verhindern (Locking)
Was ist ein Cronjob?
Ein Cronjob (von griech. Chronos = Zeit) dient dazu, wiederkehrende Aufgaben nach einem Zeitplan auszuführen. Cronjobs werden häufig für das Erstellen von regelmäßigen Backups oder das Durchführen von Wartungsarbeiten (z.B. Leeren temporärer Verzeichnisse, Löschen alter Cachedateien) verwendet. Die Aufgabe beziehungsweise die Aktionen, die durchgeführt werden sollen, werden in ein Cronskript definiert. Diese Skripte können in den Skriptsprachen Perl, PHP, Python, Ruby, TCL oder Bash (Shellskript) verfasst werden.
Die Cronjobs werden über das KIS unter folgendem Menüpunkt verwaltet:
Produktverwaltung - WebServer - Konfigurieren - Skripte & Datenbanken - Cronjobs.
Voraussetzungen
Damit Sie Cronjobs konfigurieren können, müssen einige Voraussetzungen erfüllt sein:
- Ein Standard Absender für Skript-E-Mails muss hinterlegt werden. Sie können dies im KIS unter dem folgenden Punkt erledigen:
Produktverwaltung - WebServer - Konfigurieren - Skripte & Datenbanken - Skript-Einstellungen - Der SSH-Zugang muss aktiviert sein. Die Aktivierung können Sie hier vornehmen:
Produktverwaltung - WebServer - Konfigurieren - Sicherheit & SSL - SSH Zugang konfigurieren - Das Cronskript muss ausführbar sein. Setzen Sie dazu die Dateirechte per FTP, SSH oder Dateiverwaltung im KIS auf 750.
- In der ersten Zeile des Skripts muss der zuständige Interpreter (sog. Shebang) eingetragen werden. Die Interpreter für die verschiedenen Skriptsprachen haben wir in folgendem Artikel aufgelistet:
Wie lauten die Pfade zu den Skriptinterpretern? - Das Skript muss in der Codierung
UTF-8
,ISO-8859-15
,ISO-8859-1
oderANSI
vorliegen. Ein guter Texteditor zeigt dies im Regelfall in der Fußzeile an. - Im Skript dürfen keine Windows Zeilenumbrüche (CRLF bzw. rn) enthalten sein. Einige Texteditoren (z.B. Notepad++) bieten eine Konvertierung von Windows Zeilenumbrüchen zu Unix Zeilenumbrüchen (LF bzw. n) an. Alternativ können Sie beim Hochladen des Skripts per FTP auch den Übertragungsmodus des FTP-Programms von Binär auf ASCII umstellen. Die Zeilenumbrüche werden dann automatisch konvertiert.
Konfiguration im KIS
Sind die oben genannten Voraussetzungen erfüllt, können Sie das Skript auf den Server laden. Navigieren Sie anschließend im KIS zum folgenden Menüpunkt:
Produktverwaltung - WebServer - Konfigurieren - Skripte & Datenbanken - Cronjobs.
Wählen Sie hier aus der Liste der eingerichteten E-Mail-Adressen eine E-Mail-Adresse aus, an die Fehlermeldungen oder Ausgaben des Skripts gesendet werden sollen. Bestätigen Sie Ihre Auswahl anschließend per Klick auf "Speichern":
Klicken Sie anschließend auf "Neuen Cronjob definieren". Sie gelangen nun in das Auftragsformular, in dem Sie die auszuführende Aufgabe sowie den Zeitplan festlegen können.
Definition der Aufgabe
1. Aktiviert: Über die Schaltfläche "Aktiviert" können Sie den Cronjob aktivieren (Ja) oder deaktivieren (Nein).
2. Beschreibung: Dieses Feld ist hilfreich, wenn Sie mehrere Cronjobs nutzen und trotzdem den Überblick nicht verlieren möchten.
3. Skript: Hier geben Sie den Pfad zum auszuführenden Programm oder Skript an. Der Befehl wird relativ zum Pfad des Haupverzeichnisses Ihres Webspaces angegeben. Befindet sich Ihr Skript zum Beispiel im Verzeichnis /is/htdocs/wp1234567_ABCDEFGHI/www/cronjobs/db-backup.php
, so geben Sie hier /www/cronjobs/db-backup.php
ein. Alternativ können Sie den "Browse" Link zur Auswahl des Skripts nutzen, wenn Sie den Pfad nicht eintippen möchten.
| Wichtig |
Das Eintragen einer URL, wie zum Beispiel "http://www.nur-ein-beispiel.de/backend/cron" ist nicht möglich. Eine Lösung für diesen Anwendungsfall finden Sie in den Erweiterten Beispielen.
4. Parameter (optional): Über dieses Feld können Sie dem oben angegebenen Skript zusätzliche Parameter mitgeben. In diesem Fall uunterstützt das Skript den Parameter "--compress" mit dem man das Datenbank Backup komprimieren kann. Die Parameter können optional auch direkt in das "Skript" Feld eingegeben werden.
5. Benutzer: Wählen Sie hier, mit welchem Systembenutzer der Cronjob ausgeführt werden soll. Soll der Job mit den Berechtigungen des WebServers ausgeführt werden, wählen Sie hier den wp-Benutzer. Alternativ steht noch der ftp-Benutzer zur Verfügung, welcher im Gegensatz zum wp-Benutzer über Schreibrechte im Hauptverzeichnis Ihres Webspaces (z.B. /is/htdocs/wp1234567_ABCDEFGHI/
) verfügt.
Festlegen des Zeitplans
Bei dem Festlegen des Ausführungsplans haben Sie die Wahl zwischen den drei folgenden Optionen:
1. Jeden Tag um: Hier können Sie eine feste Uhrzeit - hier 02:15 Uhr morgens - angeben, zu welcher der Cronjob ausgeführt werden soll.
2. Alle X Minuten/Stunden: Mit dieser Option können Sie ein Ausführungsintervall angeben. Muss Ihr Cronjob zum Beispiel alle 2 Stunden laufen, tragen Sie hier eine 2 ein und wählen aus dem Dropdown die Option "Stunden" aus.
3. Individuell: Für komplexe Ausführungsintervalle können Sie diese Option nutzen. Die Eingabefelder erwarten das Standard Crontab Format. Mehr dazu finden Sie in den folgenden zwei Abschnitten.
Einfache Zeitangaben
In den folgenden Feldern können Sie die Zeiten festlegen, zu denen der Cronjob ausgeführt werden soll. Ein * bedeutet eine Ausführung zu jedem möglichen Zahlenwert des jeweiligen Feldes. Im folgenden einige Beispiele dazu:
Minuten | Stunden | Tage | Monate | Wochentage | Bedeutung |
---|---|---|---|---|---|
* | * | * | alle | alle | Jede Minute |
30 | 15 | * | alle | alle | Jeden Tag um 15:30 Uhr |
8 | * | * | alle | alle | Acht Minuten nach jeder vollen Stunde (0:08 Uhr, 1:08Uhr, usw.) |
0 | 0 | 15 | alle | alle | Am 15. eines jeden Monats um 0:00 Uhr |
Komplexe Zeitangaben
Obwohl sich aus den bisher beschriebenen Möglichkeiten zur Angabe der Ausführungszeit bereits sehr viele nützliche Varianten ergeben, lassen sich damit nicht alle Szenarien abbilden. So wäre ein Cronjob, der an jedem Montag, Mittwoch und Freitag in der Zeit von 01:00 Uhr bis 04:00 Uhr alle fünf Minuten ausgeführt wird, so nicht realisierbar. Zugegebenermaßen ist dieses Beispiel schon recht speziell, aber auch für diese Zwecke ist der Cron-Dienst gerüstet und bietet folgende Sonderzeichen zur erweiterten Konfiguration:
- "/" kann eine Zeitangabe teilen
- "-" gibt einen Zeitraum an (von x bis y = x-y)
- "," kann mehrere Zeitangaben kombinieren
Der Cronjob im oben abgebildeten Screenshot nutzt zum Beispiel das "/" Zeichen und würde alle 15 Minuten ausgeführt.
Einige Beispiele zur Verdeutlichung:
Minuten | Stunden | Tage | Monate | Wochentage | Bedeutung |
---|---|---|---|---|---|
*/30 | * | * | alle | alle | Alle 30 Minuten |
0 | */4 | * | alle | alle | Alle vier Stunden zur vollen Stunde (08:00 Uhr, 12:00 Uhr, usw.) |
*/5 | 1-4 | * | alle | Mo, Mi, Fr | Montags, Mittwochs und Freitags von 01:00 Uhr bis 04:00 Uhr alle 5 Minuten |
0 | 3 | * | alle | Mo, Di, Mi, Do, Fr | Montag bis Freitag um 03:00 Uhr |
0 | 6,12,18 | */2 | alle | alle | An jedem zweiten Tag um 06:00 Uhr, 12:00 Uhr und 18:00 Uhr |
Erweiterte Beispiele
Aufruf einer URL
Da eine URL nicht direkt als Befehl eingetragen werden kann, muss ein kleiner Umweg über ein sogenanntes Wrapperskript in Kauf genommen werden welches den eigentlichen Aufruf durchführt. Ein einfaches Beispiel in Form eines Shellskripts sieht wie folgt aus:
#!/bin/sh
curl -Iso /dev/null "http://www.example.com/pfad/zum/ziel"
Hinweis: Wenn Ihre URL eckige Klammern [] enthält muss bei cURL zusätzlich der Parameter -g angehängt werden:
#!/bin/sh
curl -Isog /dev/null "http://www.example.com/pfad/zum/ziel.php?parameter[]=3¶meter2=test"
Die Nutzung von wget ist ebenfalls möglich:
#!/bin/sh
wget -q -O - "http://www.example.com/pfad/zum/ziel"
Einige Anwendungsbeispiele finden Sie unter den vorgefertigten Cronjobs.
Übergabe von Parameteren
Die in dem Feld Skript oder Parameter (optional) übergebenen Parameter stehen innerhalb des Skripts zur weiteren Verarbeitung zur Verfügung. Bei Shellskripten können Sie beispielsweise per $1
auf den ersten Parameter und per $2
auf den zweiten zugreifen. Bei PHP ist dies mit $argv[1]
und $argv[2]
und bei Perl mit $ARGV[0]
und $ARGV[1]
möglich.
Häufige Fehlerquellen
Fehlermeldung "Permission denied" per E-Mail
In diesem Fall sind für Ihr Skript falsche Berechtigungen gesetzt. Das Skript muss ausführbar sein, damit der Cronjob korrekt läuft. Setzen Sie dafür die Berechtigungen per FTP oder SSH auf 750.
Fehlermeldung "bad interpreter: No such file or directory" per E-Mail
Hier gibt es zwei mögliche Ursachen:
- Im zuständigen Interpreter (Shebang) hat sich ein Tippfehler eingeschlichen.
- Das Skript enthält Windows Zeilenumbrüche anstelle von Unix Zeilenumbrüchen (CRLF anstelle von LF). Dies ist am ^M in der Fehlermeldung hinter dem Shebang zu erkennen:
#!/usr/local/bin/php^M: bad interpreter: No such file or directory
Sie können dies korrigieren indem Sie die Datei nochmal per FTP im ASCII Modus hochladen oder die Zeilenumbrüche mit einem Texteditor wie z.B. Notepad++ in das Unix Format konvertieren.
Verweise auf andere Dateien (requires / includes) funktionieren nicht
Der Cronjob wird immer vom Haupverzeichnis Ihres Webspaces (z.B. /is/htdocs/wp1234567_ABCDEFGHI/
) ausgeführt. Liegt Ihr Skript nun beispielsweise im Verzeichnis /is/htdocs/wp1234567_ABCDEFGHI/www/cronjobs/db-backup.php
und Sie versuchen z.B. per require
die Datei backup-helper.php
, welche sich im gleichen Verzeichnis befindet, einzubinden, so muss hier der Pfad relativ zum Haupverzeichnis Ihres Webspaces angegeben werden:
require www/cronjobs/backup-helper.php
anstelle von
require backup-helper.php
Alternativ können Sie auch per chdir(dirname(__FILE__));
in das Skriptverzeichnis wechseln. So können Sie dann problemlos require backup-helper.php
verwenden. Eine weitere Möglichkeit ist das verwenden von absoluten Pfaden (z.B. require /is/htdocs/wp1234567_ABCDEFGHI/www/cronjobs/backup-helper.php
), was den Code allerdings etwas unübersichtlich macht.
Vorgefertigte Cronjobs
Datenbank Backup
Mit diesem Skript können Sie sich ein Backup einer MySQL Datenbank in ein Verzeichnis auf Ihrem Webspace legen lassen.
#!/usr/local/bin/php
<?php
$user = 'MYSQL_USER'; // MySQL-Benutzer
$password = 'MYSQL_PASSWORD'; // MySQL-Passwort
$db_name = 'DB_NAME'; // Die zu sichernde Datenbank
$db_host = 'MYSQL_HOST'; // Datenbankserver z.B. localhost
$backup_folder = '/is/htdocs/wpID_HASH/www/'; // Zielverzeichnis
$backup_file = 'backup_'.$db_name.'_'.date( 'Y-m-d_H:i:s' ).'.sql.gz'; // Backupdatei
$email = "mail@yourdomain.de"; // E-Mail für evtl. fehlerausgabe
$subject = "DB-Backup-Error"; // E-Mail-Betreff
$backup = $backup_folder.$backup_file;
$return_var = 0;
$output = system( sprintf(
'/usr/bin/mysqldump --no-tablespaces -u%s -p%s -h%s %s | gzip > %s',
escapeshellarg( $user ),
escapeshellarg( $password ),
escapeshellarg( $db_host ),
escapeshellarg( $db_name ),
escapeshellarg( $backup ) ),
$return_var );
if ( ( $return_var != 0 ) || ( false === chmod( $backup, 0666 ) ) ) {
mail(
$email,
$subject,
"Beim Backup der Datenbank ist ein Fehler aufgetreten.\nAusgabe: ". $output." ,".$return_var,
'From: "Cron Job" <'.$email.'>'
);
}
?>
Wordpress Cronjob
Wordpress hat zwar bereits einen internen "WP-Cron" jedoch läuft dieser nur, wenn auch Besucher auf Ihrer Seite unterwegs sind. Ohne Besucher gibt es daher auch keinen WP-Cron. Bei Seiten mit vielen Benutzern kann es allerdings auch vorkommen, dass der WP-Cron viel zu häufig läuft und damit unnötig Last auf dem Server verursacht. Besser ist es in diesem Fall den WP-Cron durch einen richtigen Cronjob zu ersetzen. Gehen Sie dazu wie folgt vor:
- Deaktivieren Sie zunächst den WP-Cron, in dem Sie folgende Zeile oberhalb von "That's all, stop editing! Happy blogging." in Ihre wp-config.php eintragen:
define('DISABLE_WP_CRON', true);
- Legen Sie nun eine Datei
wp-cron.sh
in Ihrem Wordpress Verzeichnis mit folgendem Inhalt an:
#!/bin/sh
wget -O - -q "http://www.nur-ein-beispiel.de/wp-cron.php?doing_wp_cron" > /dev/null
exit 0 - Vergeben Sie nun die Rechte 750 für diese Datei und tragen Sie diese dann als Cronjob im KIS ein.
Piwik Cronjob
Um in Piwik eine automatische Archivierung durchzuführen, können Sie das folgende Skript verwenden:
#!/bin/sh
/usr/bin/php console core:archive --url=http://nur-ein-beispiel.de/piwik/
Beachten Sie dabei, dass dieses Skript im Piwik Hauptverzeichnis abgelegt werden muss, um korrekt zu funktionieren.
OwnCloud Cronjob
Einen Cronjob für OwnCloud können Sie einrichten, indem Sie die Datei cron.php
im OwnCloud Hauptverzeichnismit einem Texteditor öffnen und in der ersten Zeile #!/usr/bin/php
eintragen. Das öffnende PHP-Tag (<?php
) steht dann in der zweiten Zeile. Vergeben Sie dann für die Datei die Rechte 750 und tragen Sie diese dann im KIS als Cronjob ein.
Parallel laufende Jobs verhindern (Locking)
Der Cron Dienst führt ihm anvertraute Aufgabe immer zum gewünschten Zeitpunkt aus. Dabei ist es unerheblich, ob die Vorherige Aufgabe abgeschlossen wurde oder nicht. Im schlimmsten Fall kann so etwas einem Aufschaukeln der Jobs führen. Es laufen dann mehrere Instanzen des selben Jobs parallel. Man kann dies mit einem speziell angepassten Wrapperskript verhindern. Eine Variante finden Sie im Folgenden:
#!/bin/sh
# Pfad zum Verzeichnis dieser Datei
CRONPATH=$(dirname $(readlink -f "$0"))
# Name des auszuführenden Skripts inklusive Parameter
CRONSCRIPT="mein-cronskript.php"
# Interpreter, mit dem das Skript ausgeführt werden soll
EXEC="/usr/bin/php7.0"
# Name der Lockdatei
LOCKFILE="${CRONPATH}/${CRONSCRIPT%.*}.lock"
# Lockdatei sperren und Skript ausführen
if ! /usr/bin/flock --timeout=1 ${LOCKFILE} ${EXEC} ${CRONPATH}/${CRONSCRIPT}; then
echo "Der vorherige Job läuft noch!"
exit 1
fi
Das Programm flock (Manual Page) erstellt hier eine .lock Datei und sperrt diese. Sollte nun diese Job vom Cron Dienst gestartet werden, wenn der zuvor gestartete noch nicht beendet ist, kann flock die .lock Datei nicht sperren und bricht die Ausführung ab.