Planen von Aufgaben mit Cron-Jobs

Cron-Jobs werden zum Planen von Tasks zur Ausführung auf dem Server verwendet. Sie werden am häufigsten für die Automatisierung der Systemwartung oder -verwaltung verwendet. Sie sind jedoch auch für die Entwicklung von Webanwendungen relevant. Es gibt viele Situationen, in denen eine Webanwendung bestimmte Aufgaben benötigt, um regelmäßig ausgeführt zu werden. Heute werden wir die Grundlagen von Cron Jobs erkunden.

Definitionen

Machen wir uns zunächst mit den Begriffen dieses Themas vertraut.

"Cron" ist ein zeitbasierter Job-Scheduler in Unix-ähnlichen Betriebssystemen (Linux, FreeBSD, Mac OS usw.). Und diese Jobs oder Aufgaben werden als "Cron Jobs" bezeichnet..

Auf diesen Systemen läuft ein Cron-Daemon. Ein Daemon ist ein Programm, das ständig im Hintergrund ausgeführt wird und normalerweise vom System initiiert wird. Dieser Cron-Daemon ist dafür verantwortlich, diese Cron-Jobs termingerecht zu starten.

Der Zeitplan befindet sich in einer Konfigurationsdatei mit dem Namen "crontab". Dort werden alle Aufgaben und ihre Timer aufgelistet.

Warum Cron-Jobs verwenden??

Server-Admins verwenden seit langem Cron-Jobs. Da die Zielgruppe dieses Artikels Web-Entwickler sind, wollen wir uns einige Anwendungsfälle von Cron-Jobs ansehen, die in diesem Bereich relevant sind:

  • Wenn Sie über eine Mitgliederwebsite verfügen, auf der Konten ein Ablaufdatum haben, können Sie Cron-Jobs so planen, dass Konten, die das Ablaufdatum überschritten haben, regelmäßig deaktiviert oder gelöscht werden.
  • Sie können täglich Newsletter-E-Mails versenden.
  • Wenn Sie in Ihrer Datenbank Übersichtstabellen (oder materialisierte Ansichten) haben, können diese regelmäßig mit einem Cron-Job aktualisiert werden. Sie können beispielsweise jeden Webseiten-Treffer in einer Tabelle speichern, eine andere Übersichtstabelle kann jedoch tägliche Verkehrszusammenfassungen enthalten.
  • Sie können zwischengespeicherte Datendateien in einem bestimmten Intervall verfallen lassen und löschen.
  • Sie können den Inhalt Ihrer Website automatisch auf beschädigte Links überprüfen und regelmäßig einen E-Mail-Bericht an Sie senden.
  • Sie können lang laufende Tasks so planen, dass sie über ein Befehlszeilenskript ausgeführt werden, anstatt sie über ein Webskript auszuführen. Wie das Kodieren von Videos oder das Versenden von Massen-E-Mails.
  • Sie können sogar etwas so einfaches durchführen wie das Abrufen der neuesten Tweets, die in einer Textdatei zwischengespeichert werden.

Syntax

Hier ist ein einfacher Cron-Job:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Es gibt zwei Hauptteile:

  1. Der erste Teil ist "10 * * * *". Hier planen wir den Timer.
  2. Der Rest der Zeile ist der Befehl, wie er von der Befehlszeile aus ausgeführt würde.

Der Befehl selbst besteht in diesem Beispiel aus drei Teilen:

  1. "/ usr / bin / php". PHP-Skripte sind normalerweise nicht selbst ausführbar. Deshalb müssen wir es durch den PHP-Parser laufen lassen.
  2. "/www/virtual/username/cron.php". Dies ist nur der Pfad zum Skript.
  3. "> / dev / null 2> & 1". Dieser Teil behandelt die Ausgabe des Skripts. Mehr dazu später.

Timing-Syntax

Dies ist der erste Teil der Cron-Jobzeichenfolge, wie oben erwähnt. Sie bestimmt, wie oft und wann der Cron-Job ausgeführt wird.

Es besteht aus fünf Teilen:

  1. Minute
  2. Stunde
  3. Monatstag
  4. Monat
  5. Wochentag

Hier ist eine Illustration:

Sternchen

Häufig sehen Sie anstelle einer Zahl ein Sternchen (*). Dies repräsentiert alle möglichen Nummern für diese Position. Zum Beispiel würde ein Sternchen in der Minutenposition jede Minute laufen.

Um diese Syntax vollständig zu verstehen, müssen wir uns einige Beispiele ansehen.

Beispiele:

Dieser Cron-Job wird jede Minute und zu jeder Zeit ausgeführt:

 * * * * * [Befehl]

Dieser Cron-Job wird jede Minute (also einen stündlichen Cron-Job) zur Minute Null ausgeführt:

 0 * * * * [Befehl]

Dies ist auch ein stündlicher Cron-Job, der jedoch in Minute 15 ausgeführt wird (z. B. 00:15, 01:15, 02:15 usw.):

 15 * * * * [Befehl]

Diese wird einmal täglich um 2:30 Uhr ausgeführt:

 30 2 * * * [Befehl]

Diese wird einmal am Monat am zweiten Tag des Monats um Mitternacht ausgeführt (d. H. 2. Januar, 2. Februar, 2. Februar usw.):

 0 0 2 * * [Befehl]

Diese wird montags jede Stunde ausgeführt (d. H. 24 mal an einem Tag, jedoch nur montags):

 0 * * * 1 [Befehl]

Sie können mehrere durch Kommas getrennte Zahlen verwenden. Dieser wird dreimal stündlich in den Minuten 0, 10 und 20 ausgeführt:

 0,10,20 * * * * [Befehl]

Divisionsoperator wird ebenfalls verwendet. Dies wird 12 Mal pro Stunde ausgeführt, d. H. Alle 5 Minuten:

 * / 5 * * * * [Befehl]

Mit Bindestrich kann ein Bereich angegeben werden. Diese wird einmal zwischen 5:00 und 10:00 Uhr stündlich ausgeführt:

 0 5-10 * * * [Befehl]

Außerdem gibt es ein spezielles Schlüsselwort, mit dem Sie bei jedem Neustart des Servers einen Cron-Job ausführen können:

 @reboot [Befehl]

Einrichten und Verwalten von Cron-Jobs

Es gibt verschiedene Möglichkeiten, Cron-Jobs zu erstellen und zu verwalten.

Bedienfelder

Viele Webhosting-Unternehmen stellen ihren Kunden Kontrollfelder zur Verfügung. Wenn Sie einer von ihnen sind, können Sie möglicherweise einen Abschnitt in Ihrem Steuerungsfeld finden, um Ihre Cron-Jobs zu verwalten.

Bearbeiten der Crontab

Wenn Sie diesen Befehl ausführen, wird vi (Texteditor) gestartet, und Sie können den Inhalt der Crontab bearbeiten:

 Crontab -e

Daher ist es hilfreich, sich mit den grundlegenden vi-Befehlen vertraut zu machen, da es sich von allen anderen Texteditoren unterscheidet, mit denen Sie möglicherweise gearbeitet haben.

Wenn Sie nur die vorhandene Crontab sehen möchten, ohne sie zu bearbeiten, können Sie den folgenden Befehl ausführen:

 Crontab -l

So löschen Sie den Inhalt der Crontab:

 Crontab -r

Laden einer Datei

Sie können alle Cron-Jobs in eine Datei schreiben und dann in die Crontab verschieben:

 crontab cron.txt

Seien Sie vorsichtig, da dadurch alle vorhandenen Cron-Jobs ohne Warnung mit dem Inhalt dieser Datei überschrieben werden.

Bemerkungen

Sie können Kommentare hinzufügen, gefolgt von dem Zeichen #.

 # Dieser Cron-Job hat etwas sehr Wichtiges. 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

E-Mail einstellen

Wie bereits erwähnt, wird die Ausgabe von crons standardmäßig per E-Mail gesendet, es sei denn, Sie löschen sie oder leiten sie in eine Datei um. Mit der MAILTO-Einstellung können Sie festlegen oder ändern, an welche E-Mail-Adresse sie gesendet werden sollen:

 MAILTO = "[email protected]" # Dieser Cron-Job hat etwas sehr Wichtiges. 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Verwendung des PHP-Parsers

CGI-Skripts sind standardmäßig ausführbar, PHP-Skripts jedoch nicht. Sie müssen den PHP-Parser durchlaufen. Deshalb müssen wir den Pfad zum Parser vor den Pfad des Skripts setzen.

 * * * * * / usr / bin / php [Pfad zum PHP-Skript]

Manchmal kann es sich auch unter einem anderen Speicherort befinden: "/ usr / local / bin / php". Um dies herauszufinden, können Sie versuchen, dies in der Befehlszeile auszuführen:

 welche php

Umgang mit der Ausgabe

Wenn Sie die Ausgabe des Cron-Skripts nicht verarbeiten, werden sie als E-Mail an Ihr Benutzerkonto auf dem Server gesendet.

Ausgabe verwerfen

Wenn Sie am Ende des Befehls cron job (oder eines beliebigen Befehls) "> / dev / null 2> & 1" eingeben, wird die Ausgabe verworfen.

Die schließende Klammer (>) dient zum Umleiten der Ausgabe. "/ dev / null" ist wie ein schwarzes Loch für die Ausgabe. Alles, was dort hingeht, wird vom System ignoriert.

Dieser Teil "2> & 1" bewirkt, dass der Ausgang STDERR (Fehler) an den Ausgang STDOUT (Normal) umgeleitet wird. So endet das auch in der "/ dev / null".

Ausgabe in eine Datei

Um die Cron-Ausgabe in einer Datei zu speichern, verwenden Sie erneut die schließende Klammer (>):

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> /var/log/cron.log

Dadurch wird die Ausgabedatei jedes Mal neu geschrieben. Wenn Sie die Ausgabe am Ende der Datei anstelle eines vollständigen Umschreibens anhängen möchten, verwenden Sie stattdessen eine doppelt schließende Klammer (>>):

 10 * * * * / usr / bin / php /www/virtual/username/cron.php >> /var/log/cron.log

Ausführbare Skripte

Normalerweise müssen Sie den Parser wie zu Beginn des Befehls angeben. Es gibt jedoch eine Möglichkeit, Ihre PHP-Skripts wie ein CGI-Skript von der Befehlszeile aus ausführbar zu machen.

Sie müssen den Pfad zum Parser als erste Zeile des Skripts hinzufügen:

 #! / usr / local / bin / php 

Stellen Sie außerdem sicher, dass Sie das richtige chmod (wie 755) einstellen, um die Datei ausführbar zu machen.

Wenn Sie ein ausführbares Skript haben, kann der Cron-Job folgendermaßen kürzer sein:

 10 * * * * /www/virtual/username/hello.php

Cron-Job-Kollision verhindern

In einigen Fällen haben Sie häufig Cron-Jobs ausgeführt und möchten möglicherweise nicht, dass sie kollidieren, wenn sie länger dauern als die Frequenz selbst.

Beispielsweise kann es vorkommen, dass jede Minute ein Cron-Job ausgeführt wird. Hin und wieder kann es jedoch länger als eine Minute dauern. Dies kann dazu führen, dass eine andere Instanz des gleichen Cron-Skripts ausgeführt wird, bevor das vorherige beendet ist. Sie können auf diese Weise zu viele ausgelastete Prozesse erstellen und möglicherweise den Server zum Absturz bringen, wenn sie sich gegenseitig verlangsamen und im Laufe der Zeit noch mehr Prozesse erstellen.

Dieses Problem kann durch Dateisperren behoben werden, insbesondere durch den nicht blockierenden Typ (LOCK_NB) von Dateisperren. (Wenn Sie mit dem Sperren von Dateien nicht vertraut sind, schlage ich vor, dass Sie zuerst darüber lesen.)

Sie können diesen Code zum cron-Jobskript hinzufügen:

 $ fp = fopen ('/ tmp / lock.txt', 'r +'); if (! Flock ($ fp, LOCK_EX | LOCK_NB)) Echo 'Sperrung nicht möglich'; Ausfahrt (-1);  / *… * / Fclose ($ fp);

Bei regulären Dateisperren würde der Aufruf der Funktion flock () das Skript blockieren, wenn eine Sperre vorhanden ist. Und es würde sich lösen, sobald das Schloss weg ist. Bei einer nicht blockierenden Sperre, wie im obigen Code, stoppt der Funktionsaufruf das Skript jedoch nicht, es wird jedoch sofort FALSE zurückgegeben, wenn eine Sperre vorhanden ist. In diesem Fall können wir das Skript also sofort beenden, wenn eine vorhandene Sperre angezeigt wird. Dies bedeutet, dass derzeit ein anderer Cron-Job ausgeführt wird.

Blockieren des Webzugriffs auf Cron-Jobs

Wenn Sie einen Cron-Job in einer Skriptsprache wie PHP schreiben, möchten Sie möglicherweise sicherstellen, dass niemand ihn ausführen kann, indem Sie ihn einfach aus seinem Browser laden. Eine einfache Möglichkeit wäre, diese Skripte außerhalb Ihres Webordners zu speichern. Dies kann jedoch für manche Entwickler nicht praktikabel oder vorzuziehen sein, wenn sie ihre cron-Jobskripts direkt in ihren Webanwendungsordnern aufbewahren möchten.

Wenn Sie alle cron-Jobskripts in einen Ordner ablegen, blockieren Sie den Zugriff, indem Sie diese Zeile in eine .htaccess-Datei einfügen:

 abgelehnt von allen

Oder Sie können den Zugriff auf Skripte auch einzeln verweigern, indem Sie diese Zeile an den Anfang setzen:

 if (isset ($ _ SERVER ['REMOTE_ADDR']))) die ('Berechtigung verweigert.');

Dadurch wird sichergestellt, dass das Skript beim Zugriff auf das Skript sofort abgebrochen wird.

Fazit

Danke fürs Lesen. Obwohl Cron-Jobs nur für Systemadmins wie ein Werkzeug erscheinen, sind sie tatsächlich für viele Arten von Webanwendungen relevant.

Bitte hinterlassen Sie Ihre Kommentare und Fragen und haben Sie einen schönen Tag!

Schreibe ein Plus-Tutorial

Wussten Sie, dass Sie bis zu 600 US-Dollar verdienen können, wenn Sie ein PLUS-Tutorial und / oder einen Screencast für uns schreiben? Wir suchen ausführliche und gut geschriebene Tutorials zu HTML, CSS, PHP und JavaScript. Wenn Sie die Möglichkeit haben, wenden Sie sich bitte an Jeffrey unter [email protected].

Bitte beachten Sie, dass die tatsächliche Kompensation von der Qualität des abschließenden Tutorials und des Screencasts abhängt.

  • Folgen Sie uns auf Twitter oder abonnieren Sie den Nettuts + RSS-Feed für die besten Webentwicklungs-Tutorials im Web.