So ändern Sie das Verhalten von Skripten auf Signalen mithilfe von Bash -Fallen
- 3291
- 871
- Matteo Möllinger
Zielsetzung
Das Ziel dieses Tutorials ist es, zu beschreiben, wie die Bash -Shell verwendet wird fangen
in erbaut, um unsere Skripte in der Lage zu machen, bestimmte Aktionen auszuführen, wenn sie ein Signal oder in anderen spezifischen Situationen erhalten.
Anforderungen
- Keine besonderen Anforderungen
Schwierigkeit
EINFACH
Konventionen
- # - Erfordert, dass gegebene Linux -Befehle entweder mit Root -Berechtigungen ausgeführt werden müssen
direkt als Stammbenutzer oder durch Verwendung vonsudo
Befehl - $ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können
Einführung
Beim Schreiben von Skripten, die für eine beträchtliche Zeit ausgeführt werden sollen, ist es sehr wichtig, ihre Robustheit zu erhöhen, indem sie auf Systemsignale reagieren und spezifische Aktionen ausführen, wenn einige von ihnen empfangen werden. Wir können diese Aufgabe mit der Bash erfüllen fangen
gebaut.
Was sind Fallen?
Eine Falle ist ein Bash -Mechanismus, der es ermöglicht, ein Skriptverhalten anzupassen, wenn es ein Signal empfängt. Dies ist beispielsweise sehr nützlich, um sicherzustellen, dass sich das System immer in einem konsistenten Zustand befindet. Stellen Sie sich vor. Mit Fallen können wir mit solchen Situationen umgehen.
Trap -Syntax
Die Trap -Syntax ist sehr einfach und leicht zu verstehen: Zuerst müssen wir die integrierte Falle aufrufen, gefolgt von der Ausführung der Aktionen (n), dann müssen wir die Signal (en) angeben, auf die wir reagieren möchten:
Trap [-lp] [arg] sigspec]
Mal sehen, was möglich ist fangen
Optionen sind für.
Wenn mit dem verwendet -l
Flag, der Befehl Trap zeigt nur eine Liste der mit ihren Zahlen verknüpften Signalen an. Es ist die gleiche Ausgabe, die Sie ausführen können, die das ausgeführt werden können Kill -l
Befehl:
$ Trap -l 1) SIGHUP 2) Sigint 3) Sigquit 4) Sigill 5) Sigtrap 6) Sigabrt 7) Sigbus 8) Sigfpe 9) Sigkill 10) sigusr1 11) sigsegv 12) sigusr2 13) sigaLrm) sigalrm 15) sigalrm 15) Sigalrm 15) ) Sigstkflt 17) Sigchld 18) Sigcont 19) Sigstop 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGULL 35) Sigrtmin+1 36) Sigrtmin+2 37) Sigrtmin+3 38) Sigrtmin+4 39) Sigrtmin+5 40) Sigrtmin+6 41) Sigrtmin+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 45) Sigrtmin+11 46) Sigrtmin+12 47) Sigrtmin+13 48) Sigrtmin+14 49) Sigrtmin+15 50) Sigrtmax-14 51) Sigrtmax-13 52) Sigrtmax-12 53) Sigrtmax-11 54) Sigrtmax-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-12 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX-SIGRTMAX-SIGRTMAX
Es ist wirklich wichtig anzugeben, dass es möglich ist, nur auf Signale zu reagieren, wodurch das Skript antworten kann: die Sigkill
Und Sigstop
Signale können nicht gefangen, blockiert oder ignoriert werden.
Abgesehen von Signalen können Fallen auch auf einige reagieren Pseudo-Signal
wie Beenden, ERR oder DEBUG, aber wir werden sie später im Detail sehen. Denken Sie vorerst daran, dass ein Signal entweder durch seine Nummer oder mit seinem Namen angegeben werden kann, auch ohne die Sig
Präfix.
Über die -P
Option jetzt. Diese Option hat nur einen Sinn, wenn ein Befehl nicht bereitgestellt wird (andernfalls erzeugt er einen Fehler). Wenn die Trap damit verwendet wird, wird eine Liste der zuvor festgelegten Fallen angezeigt. Wenn der Signalname oder die Signalnummer angegeben ist, werden nur der für dieses spezifische Signal angezeigte Trap -Set angezeigt, andernfalls werden keine Unterscheidungen getroffen, und alle Fallen werden angezeigt:
$ fallen 'echo "Sigint gefangen!"'Sigint
Wir setzen eine Falle, um das SIGINT -Signal zu fangen. Wenn wir jetzt Trap mit der Option -P verwenden, wird die gerade definierte Falle angezeigt:
$ fallen -p falle -'echo "sigint gefangen!"'Sigint
Übrigens ist die Falle jetzt „aktiv“. Wenn wir also ein SIGINT-Signal senden, entweder mit dem Befehl Kill oder mit der Strg-C-Verknüpfung wird der zugehörige Befehl in der Falle ausgeführt (^C wird nur gedruckt, weil der Schlüsselkombination):
^Csigint gefangen!
Falle in Aktion
Wir werden jetzt ein einfaches Skript schreiben, um Trap in Aktion anzuzeigen. Hier ist es:
#!/usr/bin/env bash # # Ein einfaches Skript zum Nachweis, wie Trap funktioniert # set -e -set -u set -o pipefail tap 'echo "Signal gefangen, Reinigung ..."; RM -i Linux_tarball.Teer.XZ 'Sigint Sigterm Echo "Downloading Tarball ..." WGet -o linux_tarball.Teer.XZ https: // cdn.Kernel.org/pub/linux/kernel/v4.X/Linux-4.13.5.Teer.xz &> /dev /null
Kopieren Das obige Skript versucht nur, den neuesten Linux -Kernel -Tarball in das Verzeichnis herunterzuladen, von dem es mithilfe des Starts wget
. Wenn die Sigint- oder Sigterm -Signale empfangen werden (beachten Sie, wie Sie mehr als ein Signal in derselben Zeile angeben können), wird die teilweise heruntergeladene Datei gelöscht.
In diesem Fall sind der Befehl tatsächlich zwei: der erste ist der Echo
die die Nachricht auf dem Bildschirm druckt, und die zweite ist die tatsächliche rm
Befehl (wir haben die Option -i -Option zur Verfügung gestellt, sodass sie die Benutzerbestätigung vor dem Entfernen gefragt werden) und sie werden durch ein Semikolon getrennt. Anstatt Befehle auf diese Weise anzugeben, können Sie auch Funktionen aufrufen: Dies gibt Ihnen mehr Wiederverwendbarkeit. Beachten Sie, dass, wenn Sie keinen Befehl geben, die Signal (n) nur ignoriert werden!
Dies ist die Ausgabe des obigen Skripts, wenn es ein SIGINT -Signal empfängt:
$ ./fetchlinux.SH Downloading Tarball… ^csignal gefangen, Reinigung… RM: Entfernen Sie die reguläre Datei 'Linux_tarball.Teer.XZ '?
Eine sehr wichtige Sache, an die Sie sich erinnern sollten, ist, dass sein existierender Status das Ergebnis von einem Skript durch ein Signal wie oben beendet wird 128 + die Signalzahl
. Wie Sie sehen können, hat das obige Skript, das von einem SIGINT gekündigt wird, einen Exit -Status von 130
:
$ echo $? 130
Zuletzt können Sie eine Falle nur durch Anruf deaktivieren fangen
gefolgt von der -
Zeichen, gefolgt vom Namen oder der Nummer des Signals:
Trap - SIGINT SIGTERMTER
Die Signale nehmen den Wert zurück, den sie am Eingang zur Schale hatten.
Pseudosignale
Wie oben erwähnt, kann Trap nicht nur für Signale festgelegt werden, die es dem Skript ermöglichen, zu reagieren, sondern auch auf das, was wir als "Pseudosignale" bezeichnen können, können sie als "Pseudosignale" bezeichnen können. Sie sind technisch gesehen keine Signale, sondern entsprechen bestimmten Situationen, die angegeben werden können:
AUSFAHRT
Wenn AUSFAHRT
In einer Falle wird angegeben, der Befehl der Falle wird beim Beenden aus der Shell ausgeführt.
IRREN
Dies führt dazu, dass das Argument der Falle ausgeführt wird, wenn ein Befehl einen Exit-Status ungleich Null zurückgibt, mit einigen Ausnahmen (dasselbe der Option Shellerrexit): Der Befehl darf nicht Teil von a sein während
oder bis
Schleife; es darf nicht Teil eines sein Wenn
konstruieren, noch ein Teil von a &&
oder ||
Liste und sein Wert darf nicht durch die Verwendung der verwendet werden !
Operator.
DEBUGGEN
Dies wird dazu führen, dass das Argument der Falle vor jedem einfachen Befehl ausgeführt wird,für
, Fall
oder wählen
Befehle und vor dem ersten Befehl in Shell -Funktionen.
ZURÜCKKEHREN
Das Argument der Falle wird nach einer Funktion oder einem Skript ausgeführt, das mithilfe verwendet wird Quelle
oder der .
Befehl.
Verwandte Linux -Tutorials:
- Wie man ein Signal an Kinderprozesse aus einer Bash verbreitet…
- Wie man Verwaltungsoperationen mit Ansible durchführt…
- So installieren Sie Signal unter Linux
- Dinge zu installieren auf Ubuntu 20.04
- So verwenden Sie den Befehl Killall unter Linux
- So beenden ich aus dem Bash -Skript
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Linux -Befehle: Top 20 wichtigste Befehle, die Sie benötigen, um…
- Virtualbox erhöhen die Diskgröße unter Linux
- GNU/Linux Allgemeiner Fehlerbehebungsleitfaden für Anfänger
- « Holen Sie sich Ihre Wettervorhersage von der Linux CLI
- Lampe (Linux, Apache, Mariadb, PHP) Stack Docker Image -Bereitstellung »