Antworten auf Ihre häufigsten Fragen

Wie richte ich einen Cronjob ein?
pdf print

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?

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 oder ANSI 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. Befehl: 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. Das Befehlsfeld bietet noch weitere Möglichkeiten, auf die wir in den Erweiterten Beispielen eingehen.
| 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.

3. Kommentar: Dieses Feld ist hilfreich, wenn Sie mehrere Cronjobs nutzen und trotzdem den Überblick nicht verlieren möchten.

Festlegen des Zeitplans

1. 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.

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:

MinutenStundenTageMonateWochentageBedeutung
***alleUnabhänging vom WochentagJede Minute
3015*alleUnabhänging vom WochentagJeden Tag um 15:30 Uhr
8**alleUnabhänging vom WochentagAcht Minuten nach jeder vollen Stunde (0:08 Uhr, 1:08Uhr, usw.)
0015alleUnabhänging vom WochentagAm 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:

MinutenStundenTageMonateWochentageBedeutung
*/30**alleUnabhänging vom WochentagAlle 30 Minuten
0*/4*alleUnabhänging vom WochentagAlle vier Stunden zur vollen Stunde (08:00 Uhr, 12:00 Uhr, usw.)
*/51-4*alleMo, Mi, FrMontags, Mittwochs und Freitags von 01:00 Uhr bis 04:00 Uhr alle 5 Minuten
03*alleMo, Di, Mi, Do, FrMontag bis Freitag um 03:00 Uhr
06,12,18*/2alleUnabhänging vom WochentagAn 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 www.example.com/pfad/zum/ziel

Die Nutzung von wget ist ebenfalls möglich:

#!/bin/sh
wget -q -O - www.example.com/pfad/zum/ziel

Einige Anwendungsbeispiele finden Sie unter den vorgefertigten Cronjobs.

Übergabe von Parameteren

In das Feld Befehl können auch Parameter zur Übergabe an das Cronskript eingetragen werden:

pfad/zum/skript.sh parameter1 parameter2

Diese Parameter stehen dann 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:

  1. Im zuständigen Interpreter (Shebang) hat sich ein Tippfehler eingeschlichen.
  2. 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'; // 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 -u%s -p%s -h%s %s > %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:

  1. 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);
  2. 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
  3. 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.


otto.friedrich@hosteurope.de xanthippe.ypsilante@hosteurope.de hercules.ikarus@hosteurope.de