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.
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.
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:
Hier ist ein einfacher Cron-Job:
10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
Es gibt zwei Hauptteile:
Der Befehl selbst besteht in diesem Beispiel aus drei Teilen:
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:
Hier ist eine Illustration:
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.
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]
Es gibt verschiedene Möglichkeiten, Cron-Jobs zu erstellen und zu verwalten.
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.
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
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.
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
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
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
Wenn Sie die Ausgabe des Cron-Skripts nicht verarbeiten, werden sie als E-Mail an Ihr Benutzerkonto auf dem Server gesendet.
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".
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
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
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.
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.
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!
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.