Programmierung & Skripten

So ändern Sie das Verhalten von Skripten auf Signalen mithilfe von Bash -Fallen

So ändern Sie das Verhalten von Skripten auf Signalen mithilfe von Bash -Fallen

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

Schwierigkeit

EINFACH

Konventionen

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.

Datum Manipulation mit Yest
yest ist ein großartiges Tool, mit dem Benutzer einige komplexe Datumsmanipulationen durchführen können, indem AB einfach zu verstehen. Es ist kein Ko...
Linux nvidia mcptop 10 erzwungenes Modul funktioniert nicht
Dieses Problem mit dem erzwungenen Modul scheint alle wichtigen Linux -Verteilungen zu beeinflussen. Jahr 2008 war das erste Mal, dass ich dieses Prob...
Mobile Breitband -Internetverbindung und sakis3g
Dieser Artikel ist nur eine Fortsetzung meines ersten Artikels über meine Erfahrungen mit dem mobilen Breitband -Internet in einem Linux -System. Die ...