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.
Verwandte Artikel
- 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.