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

Verwalten von doppelten Cron-Jobs beim Ausführen von Skripten

Wenn Sie während einer Reihe von Zeiten ein bestimmtes Muster auf Ihrem Linux-Gerät beobachtet haben, das einen Alarm für eine hohe CPU-/Speicherauslastung auslöst, wird empfohlen, die Reihe von Prozessen zu analysieren, die zum Zeitpunkt des Alarms ausgeführt wurden.

Während der Analyse stellen Sie möglicherweise fest, dass ein bestimmter Prozess oder ein bestimmtes Skript aufgrund eines doppelten Aufrufs eines geplanten Prozesses (der mithilfe von Cron-Jobs eingerichtet wurde) mehrere Instanzen gleichzeitig ausführt.

Um dies zu verhindern, können Sie zwei Alternativen verwenden:

Einrichten einer Sperrdatei

Implementieren Sie innerhalb des Skripts eine Prozedur, die überprüft, ob eine Datei vorhanden ist. Wenn dies nicht der Fall ist, erstellt das Skript es und fährt wie erwartet mit der Ausführung fort. Wenn die Datei nach Abschluss des Skripts nicht mehr benötigt wird, können Sie sie löschen, um sicherzustellen, dass die nächste Ausführung des Jobs sie nicht als „in Gebrauch“ betrachtet.

Einrichten einer PID-Datei in BASH

Ähnlich wie bei der oben genannten Methode beruht die Verwendung einer Prozess-ID-Datei (PID) auf dem Lesen einer Datei, mit dem Unterschied, dass in dieser Datei die PID der laufenden Instanz platziert wird, wodurch validiert werden kann, ob der Prozess der Prozess ist ausgeführt wird, während die Sperrdatei nur überprüft, ob das Skript gestartet wurde, unabhängig davon, ob es noch ausgeführt wird oder ob es angehalten/beendet wurde, bevor die Datei entfernt wurde.

Schritte zum Einrichten:

Durch das folgende Code-Snippet können Sie ein Beispiel des Codes sehen, den Sie in Ihrem Skript implementieren würden. Der Text, der mit einem Pfund-Symbol (#) beginnt, ist ein Kommentar innerhalb des Codes, sodass er bei der endgültigen Implementierung entfernt werden kann.

HINWEIS: Beachten Sie, dass Sie zuerst testen müssen, ob das Skript Ihren Anforderungen entspricht. Gehen Sie nicht davon aus, dass es beim ersten Versuch funktioniert. Möglicherweise sind Änderungen erforderlich.

# A. Define your PID file using the full path where it'll be located.
# Do not place your code within any /tmp folder as these get cleaned up automatically and might interfere with the expected behaviour of the script.

# B. Check if the PID file exists, if it does, it will run the intended function.
PIDFILE = /var/apps/testscript.pid

# 1. Read the content of our PID file (with cat), and assign it to the PID variable
if [ -f $PIDFILE ] then
    # 2. Verify if the content of the file is a running process
    PID = $(cat $PIDFILE)

    # In here, the '%?' variable obtains the exit code from our previous command
    ps -p $PID > /dev/null 2>&1

    # 3. If the content of the file is a process (an output equal to 0 means succesful), output a message, and exit the application.
    if [ $? -eq 0 ] then
        echo "Job is already running"
        exit 1
    else
        # 4. If the exit code was not succesful, we assume the process was not running, so we place the current process ID into the PID File
        echo $$ > $PIDFILE
        if [ $? -ne 0 ] then
        echo "Could not create PID file"
        exit 1
        fi
    fi
# C. If the PID file does not exist, it will attempt to create it, then run the code
else
    # 1. This outputs the current PID into the PID file:
    #  The '$$' value is a variable for the current PID.
    #  The '>' operand directs the output from echo to a file
    echo $$ > $PIDFILE

    # 2. If the exit code was not succesful, output an error message, and exit the application.
    if [ $? -ne 0 ]
    then
        echo "Could not create PID file"
        exit 1
    fi
fi

# *** In here you need to insert the original script code *** #

# D. Remove the PID file so we try to always have a "clean slate"
rm $PIDFILE

Andere Lösungen

Zusätzlich zu den beiden obigen Alternativen gibt es verschiedene Dienstprogramme, die Sie implementieren können.

Herde

Der flock-Befehl ist ein Dienstprogramm, das auf neueren Linux-Distributionen installiert wird und Sperren von Shell-Skripten verwaltet

Weitere Informationen zur Verwendung finden Sie in der offiziellen Dokumentation unter der folgenden URL:

  • https://manpages.ubuntu.com/manpages/xenial/man1/flock.1.html

Das Nützliche an Flock ist, dass die Dateisperre beibehalten wird, bis der ursprüngliche Prozess abgeschlossen ist, an diesem Punkt wird Flock die Dateisperre aufheben. Dies gilt unabhängig davon, ob der Prozess erfolgreich oder nicht erfolgreich abgeschlossen wird.

Allein

Solo ist ein Perl-Skript, das die Ausführung des Skripts an einen Netzwerkport statt an eine Datei bindet,

Weitere Informationen finden Sie auf der offiziellen Website:

  • https://www.timkay.com/solo/.

Ähnlich wie bei anderen Implementierungen wird hierdurch eine Sperre erstellt, die erst freigegeben wird, nachdem das zugewiesene Skript abgeschlossen ist:

$ ./solo -port=1234 /var/tmp/script.sh & 1234
$ ./solo -port=1234 /var/tmp/script.sh
solo(1234): Address already in use

Der Vorteil der Bindung eines Ports anstelle einer Datei besteht darin, dass ein Port nicht gelöscht werden kann. Was bei anderen Implementierungen die vorhandene Sperre "freigeben" würde, wodurch doppelte Instanzen eines Jobs zugelassen werden.

Zusätzliche Hinweise

Während die oben genannten Dienstprogramme und Praktiken verhindern, dass doppelte Jobs ausgeführt werden, ist es wichtig, die Art und Weise zu überwachen, wie Ihre Cronjobs interagieren, um sich überschneidende Jobs oder eine übermäßige Nutzung von Ressourcen zu vermeiden, die die Leistung unseres Geräts und unseres Betriebs beeinträchtigen könnten.

  • Herdenkommando
  • Solo-PERL-Skript.

Verwenden Sie die Registerkarte „Feedback“, um Kommentare abzugeben oder Fragen zu stellen. Sie können auch ein Gespräch mit uns beginnen.


Linux
  1. So legen Sie einen Cron-Job in TrueNAS fest

  2. Portabilität von Dateideskriptor-Links?

  3. Wann sind es ausführbare Dateien nicht?

  4. Mein Cronjob funktioniert nicht

  5. Wie richte ich einen Cron-Job ein, um jede Stunde eine ausführbare Datei auszuführen?

So richten Sie einen Cron-Job unter Linux ein

So planen Sie einen Job in Cron so, dass er jede Stunde in Ubuntu 20.04 ausgeführt wird

Wie richtet man einen Cron Job mit Sonderzeichen bei Hostinger ein?

Linux Crontab:15 fantastische Cron-Job-Beispiele

Maximale PID unter Linux

Wie kann ich einen Cron-Job anzeigen, der gerade ausgeführt wird?