GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden eines Cron-Wrapper-Skripts

Dieses Tutorial soll zwei Dinge tun:den Cron-Fehlerbehebungsartikel erweitern; und einen Überblick über ein einfaches Scripting-Konzept zu geben, das die Erstellung einer Datei als Flag verwendet, um anzuzeigen, dass etwas läuft. Dies ist vor allem nützlich, wenn Sie etwas kontinuierlich ausführen müssen, aber nicht mehr als eine Kopie gleichzeitig. Sie können eine Datei als Flag erstellen, um zu überprüfen, ob ein Job bereits ausgeführt wird, und wiederum nach diesem Flag suchen, bevor Sie weitere Maßnahmen ergreifen.

Die direkte Anwendung davon ist, wenn Sie einen Cron-Job haben, der jede Minute oder alle paar Minuten ausgeführt wird. Wenn der vorherige Job bei einem sich schnell wiederholenden Cron länger als geplant dauert, können sich diese Aufgaben häufen und den Server belasten oder andere Probleme verschlimmern. Um dies zu vermeiden, kann in der Crontab (anstelle des vorgesehenen Crontasks) ein einfaches Skript eingerichtet werden. Wenn der Cron ausgeführt wird, führt er die eigentliche Aufgabe nur aus, wenn nicht bereits ein konkurrierender Prozess ausgeführt wird.

Warum einen Cron-Wrapper verwenden?

Ein Cron-Wrapper wird verwendet, wenn Sie einen Cron-Job haben, der Rücken an Rücken laufen muss, aber nicht auf sich selbst treten darf. Dies ist gut für Aufgaben, die Sie so einrichten möchten, dass sie kontinuierlich ausgeführt werden. Jobs, die irgendwo zwischen jeder Minute und alle fünf Minuten ausgeführt werden sollten, sollten einen Wrapper wie diesen verwenden.

Wenn Sie keinen Wrapper für einen Cron-Job verwenden, der zu häufig ausgeführt wird, können Sie mehrere Jobs gleichzeitig ausführen lassen, die versuchen, dasselbe zu tun. Diese konkurrierenden Aufgaben verlangsamen die gesamte Arbeit. Diese „Stapel-Cron-Jobs“ können sogar so außer Kontrolle geraten, dass sie einen Server überlasten und dazu führen, dass der Server nicht mehr normal antwortet.

Was ist ein Cron-Wrapper?

Der Grund, warum dies als Cron-Wrapper bezeichnet wird, ist, dass es sich um ein Skript handelt, das den Cron-Job umschließt und prüft, ob bereits eine andere Instanz des Cron ausgeführt wird. Wenn eine weitere Kopie ausgeführt wird, veranlasst der Wrapper den Cron, diesen Lauf zu überspringen und bis zum nächsten Lauf zu warten, um erneut zu prüfen. Es gibt einige Möglichkeiten, wie die Cron-Wrapper dafür sorgen, dass keine Überschneidungen auftreten.

Prozessprüfmethode

Eine Möglichkeit besteht darin, alle laufenden Prozesse für den Benutzer zu überprüfen und zu überprüfen, ob es nicht bereits einen anderen Prozess mit demselben Namen oder denselben Attributen wie dem gibt, den Sie ausführen möchten. So funktioniert die cron.sh-Datei von Magento:Sie prüft, ob eine andere Instanz von cron.php als Benutzer ausgeführt wird, und wenn eine ausgeführt wird, wird sie beendet. Es kann schwierig sein, dies zuverlässig zu tun, und wir würden es daher nicht für den Anfang empfehlen.

Lockfile-Methode

Eine einfache Methode ist die Verwendung einer sogenannten Sperrdatei. Der Cron-Wrapper prüft, ob die Sperrdatei (jede Datei mit einem bestimmten Namen/Speicherort) zu Beginn des Laufs vorhanden ist. Wenn die Sperrdatei fehlt, erstellt das Skript diese Datei und fährt fort. Die Erstellung der Sperrdatei signalisiert den Start des Cron-Jobs. Wenn der Cron-Job das Wrapper-Skript abschließt, entfernt es die Sperrdatei.

Solange die Sperrdatei existiert, führt ein neuer Wrapper den Rest des Cron-Jobs nicht aus, während ein anderer läuft. Sobald der erste Lauf abgeschlossen ist und die Sperre entfernt wurde, kann ein anderer Wrapper erneut eine neue Sperrdatei erstellen und normal verarbeiten.

Ein Beispiel für ein Wrapper-Skript

Zunächst möchten wir ein einfaches Bash-Skript erstellen. Innerhalb einer Datei geben wir das Skript an, das vom Programm interpretiert werden soll /bin/bash

#!/bin/bash

Dann wollen wir den Namen und den Speicherort der Sperrdatei definieren, die wir als unser Flag verwenden werden.

# Set lockfile name and location
lockfile="~/tmp/cronwrapper.lock"

Als nächstes muss das Skript prüfen, ob diese Sperrdatei existiert. Wenn es existiert, wird bereits eine andere Kopie des Skripts ausgeführt, und wir sollten das Skript beenden.

# Check if the lockfile exists
if [[ -f $lockfile ]]; then
# If the lockfile exists quit
exit;

Andernfalls, wenn die Sperrdatei nicht existiert, sollten wir eine neue Sperrdatei erstellen, um anzuzeigen, dass wir mit dem Rest des Skripts fortfahren. Das Erstellen der Sperrdatei weist auch alle zukünftigen Kopien an, die möglicherweise ausgeführt werden, zu warten, bis die Sperrdatei entfernt wird. Wir möchten auch den tatsächlich auszuführenden Job einbeziehen, sei es ein Aufruf einer URL über das Internet, das Ausführen einer PHP-Datei auf der Befehlszeile oder irgendetwas anderes.

# If the lockfile is missing continue
else
# Create the lockfile
touch $lockfile
# Insert cron task here/code>

Sobald der beabsichtigte Job ausgeführt und abgeschlossen ist, möchten wir unsere Sperrdatei bereinigen, damit die nächste Ausführung des Cron-Jobs weiß, dass die letzte Ausführung abgeschlossen ist und alles wieder einsatzbereit ist.

# Cleanup the lockfile
rm -f $lockfile
fi

Im obigen Beispiel ist es praktisch, die Sperrdatei als Variable ($lockfile) zu definieren, damit sie später leicht referenziert werden kann. Auch wenn Sie den Speicherort ändern möchten, müssen Sie ihn nur an einer Stelle im Skript ändern.

Dieses Beispiel verwendet auch ein „~“ im Pfad zur Sperrdatei als Abkürzung. Dies weist die Shell an, das Home-Verzeichnis des Benutzers anzunehmen. Daher würde der vollständige Pfad eher so aussehen:/home/username/tmp/cron.lock.

Durch die Verwendung von „~“ können Sie jedoch Kopien desselben Skripts für viele Benutzer auf demselben Server verwenden und müssen nicht den vollständigen Pfad für jeden Benutzer ändern. Die Shell verwendet automatisch das Home-Verzeichnis für jeden Benutzer, wenn das Wrapper-Skript ausgeführt wird.

Alles zusammenfügen (cronwrapper.sh)

Sie können Folgendes kopieren und in den Texteditor Ihrer Wahl auf Ihrem Server einfügen. Du kannst es benennen wie du willst, aber hier sind alle Teile zusammengefügt.

#!/bin/bash
lockfile="~/tmp/cronwrapper.lock"
if [[ -f $lockfile ]]; then
exit;
else
touch $lockfile
# Insert cron task here
rm -f $lockfile
fi

Dies ist ein sehr einfaches Beispiel und könnte noch viel weiter ausgebaut werden. Idealerweise fügen Sie ein Häkchen hinzu, um eine Sperrdatei zu ignorieren, die älter als eine Stunde ist, und trotzdem eine neue Instanz des Cron-Jobs auszuführen. Dies würde einen unterbrochenen Job erklären, der nach sich selbst nicht bereinigt werden konnte. Eine weitere Erweiterung könnte darin bestehen, zu bestätigen, dass der vorherige Job sauber abgeschlossen wurde. Oder noch ein weiterer Vorschlag, würde nach Fehlern des ausgeführten Cron-Jobs suchen und Entscheidungen treffen oder Warnungen basierend auf diesen Fehlern senden. Wenn es um Cron-Wrapper geht, steht Ihnen die Welt offen! Werfen Sie einen Blick auf die VPS-Server unseres Liquid Web, damit Aufgaben wie diese reibungslos ablaufen.


Linux
  1. Verwenden von at für Cron-Jobs zur einmaligen Verwendung in Linux

  2. So erstellen Sie ein Startskript mit Crontab in Lubuntu Linux

  3. Cron-Job wird nicht ausgeführt?

  4. Senden von HTML-Mails mit einem Shell-Skript

  5. Automatisierung der Telnet-Sitzung mit Bash-Skripten

So automatisieren Sie Aufgaben in Linux mit Crontab

Installieren Sie Golang einfach unter Linux mit dem Update-golang-Skript

Berechtigung zum Ausführen von cron mit bash.sh verweigert

Protokolldateien mit Cron-Job entfernen

Übertragen Sie Dateien mit lftp im Bash-Skript

Wie beendet man das Linux-Terminal mit einem Python-Skript?