(trap signals)
Mit dem in die POSIX-Shell sh eingebauten Kommando trap können Sie vereinbaren, wie die aktuelle Shell auf zukünftig eintreffende Signale reagieren soll. In Shell-Prozeduren können Sie auf diese Weise festlegen, welche „Aufräumarbeiten“ vor dem Abbruch erledigt werden sollen oder an welcher Stelle keine Unterbrechung stattfinden darf. trap hat zwei Funktionen:
trap legt fest, wie die Shell auf ein Signal reagieren soll:
Die Shell führt die beim Aufruf von trap angegebenen Kommandos aus.
Wenn diese Kommandos ausgeführt sind, wird aber das eventuell abgebrochene Kommando nicht nochmals gestartet. Shell-Prozeduren werden mit dem Kommando fortgesetzt, das dem unterbrochenen folgt.Die Shell ignoriert das angegebene Signal.
Die Shell reagiert auf das angegebene Signal wieder standardmäßig. Sie können mit trap die Signalbehandlung wieder auf den Standard zurücksetzen.
trap gibt die Signale aus, für die sich in der aktuellen Shell die Behandlung geändert hat.
Syntax
trap[ kommandoliste signalnummer| signalname ...] |
legt fest, wie die Shell auf die nachfolgend angegebenen Signale reagieren soll, ob sie also
Kommandos ausführenFür kommandoliste geben Sie ein oder mehrere Kommandos an. Diese Kommandos sollenausgeführt werden, wenn das angegebene Signal eintrifft. Mehrere Kommandos trennen Sie durch Strichpunkte voneinander. Den Strichpunkt müssen Sie für die Shell entwerten. Die Kommandoliste muss ein einziges Argument sein. Sobald in dieser Liste Argument-Trennzeichen oder Strichpunkte enthalten sind, müssen Sie kommandoliste in Hochkommas '...' bzw. Anführungszeichen "..." einschließen. Wenn die angegebene kommandoliste nicht die leere Zeichenkette ist, gilt die so vereinbarte Signalbehandlung nur in der aktuellen Shell. In jeder Subshell muss diese mit trap neu vereinbart werden; andernfalls gilt die Standard-Behandlung (siehe Abschnitt „Signalbehandlung in der Shell“). Beachten Sie dabei, dass die Shell die angegebenen Kommandos zweimal interpretiert:
Deshalb haben Hochkommas und Anführungszeichen unterschiedliche Bedeutung:
Wenn Sie verhindern wollen, dass die Shell-Prozedur nach dem Eintreffen eines Signals weiter ausgeführt wird, geben Sie exit als letztes Kommando in der Kommandoliste an. Signal ignorierenDie Angabe "" oder ’’, also die leere Zeichenkette, für kommandoliste bedeutet, dass die angegebenen Signale ignoriert werden. Die entsprechenden Signale werden auch in jeder Subshell ignoriert. Signalbehandlung auf den Standard zurücksetzenWenn Sie kommandoliste nicht angeben, reagiert die Shell auf die angegebenen Signale wieder standardmäßig (siehe Abschnitt „Signalbehandlung in der Shell“).
Nummer oder Name des Signals, auf das die Shell wie angegeben reagieren soll (siehe signal() [4]). Sie können mehrere Signalnummern oder -namen angeben, jeweils getrennt durch Leerzeichen. Sobald eines dieser Signale eintrifft, wird kommandoliste ausgeführt. Sinnvolle Angaben (Signalnummer/Signalname) für die Shell sind: Die Angabe 0 für signalnummer bewirkt, dass die angegebene kommandoliste ausgeführt wird, bevor sich die aktuelle Shell beendet; 0 ist kein Signal. Das bedeutet:
Das Signal 9 (SIGKILL) führt immer zum Abbruch, daher ist trap '' 9 wirkungslos. kein Argument angegeben Wenn Sie trap ohne Argumente aufrufen, schreibt es die Signale auf die Standard-Ausgabe, für die sich in der aktuellen Shell die Behandlung geändert hat. Die Ausgabe hat folgendes Format: signalnummer: kommandoliste... Es werden aber nur die Signalnummern ausgegeben, für die Sie mit dem Kommando trap vorher eine Behandlung abweichend vom Standard vereinbart haben (siehe Abschnitt „Signalbehandlung in der Shell“ unten). |
Signalbehandlung in der Shell
Ein Prozess kann jederzeit ein Signal erhalten, das entweder er selbst, ein anderer Prozess, oder der Benutzer an der Datensichtstation z.B. durch CTRL+C erzeugt haben. Er kann darauf wie folgt reagieren:
Für die Benutzer, die über rlogin Zugang zur POSIX-Shell haben, sind folgende Signale (Nummer/Name) von Bedeutung: 1 / SIGHUP Verbindung zur Datensichtstation ist unterbrochen 2 / SIGINT Tasten CTRL+C 3 / SIGQUIT Tasten CTRL+\ 9 / SIGKILL Kommando kill -9 PID; PID ist die Prozessnummer der entsprechenden Shell 15 / SIGTERM Kommando kill -15 PID; PID ist die Prozessnummer der entsprechenden Shell Abhängig davon, ob Sie mit trap eine Signalbehandlung vereinbart haben oder nicht, reagiert die Dialog-Shell (DS) oder die Prozedur-Shell im Hintergrund (PSH) auf diese Signale wie folgt: Signal-Nummer 1 DS: ignorieren Signal-Nummer 2 DS: vereinbarte Signalbehandlung nach dem nächsten Kommando oder nach Betätigung der Eingabetaste ausführen, sonst: ignorieren Signal-Nummer 3 DS: vereinbarte Signalbehandlung nach dem nächsten Kommando oder nach Betätigung der Eingabetaste ausführen, sonst: ignorieren Signal-Nummer 9 DS: abbrechen Signal-Nummer 15 DS: ignorieren Abhängig davon, ob Sie mit trap eine Signalbehandlung vereinbart haben oder nicht, reagiert eine Shell-Prozedur (ShP) bzw. ein aktueller Vordergrundprozess in der Shell-Prozedur (VgP) wie folgt (PID steht jeweils für die Prozessnummer der Shell-Prozedur): Keine Vereinbarung für Shell-Prozedur und für aktuellen Vordergrundprozess der Shell-Prozedurkill -1 PID ShP: bricht sofort ab kill -2 PID ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab CTRL+C ShP: bricht sofort ab kill -3 PID ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab CTRL+\ ShP: bricht sofort ab kill -9 PID ShP: bricht sofort ab kill -15 PID ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab Keine Vereinbarung für Shell-Prozedur; Vereinbarung für aktuellen Vordergrundprozess der Shell-Prozedurkill -1 PID ShP: bricht sofort ab kill -2 PID ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab CTRL+C ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab kill -3 PID ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab CTRL+\ ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab kill -9 PID ShP: bricht sofort ab kill -15 PID ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab Vereinbarung für Shell-Prozedur; keine Vereinbarung für aktuellen Vordergrundprozess der Shell-Prozedurkill -1 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs kill -2 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs CTRL+C ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs kill -3 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs CTRL+\ ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs kill -9 PID ShP: bricht sofort ab kill -15 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs Vereinbarung für Shell-Prozedur und aktuellen Vordergrundprozess der Shell-Prozedurkill -1 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs kill -2 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs CTRL+C ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs kill -3 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs CTRL+\ ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs kill -9 PID ShP: bricht sofort ab kill -15 PID ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs In C-Programmen vereinbaren Sie mit der Funktion signal(), wie das Programm auf eintreffende Signale reagieren soll (siehe signal() [4]). |
Internationale Umgebung
Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos trap: LANG Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden. LC_ALL Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen. LC_CTYPE Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung. LC_MESSAGES Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden. NLSPATH Legt den Pfad der Meldungsdateien für LC_MESSAGES fest. |
Beispiel 1
In einer Shell-Prozedur soll das Signal 2 ignoriert werden. Deshalb enthält diese Prozedur die folgende Zeile: trap '' 2 Die zwei Hochkommas, also die leere Zeichenkette, bewirken, dass das Signal 2 ignoriert wird. Die Shell-Prozedur kann also nicht von außen durch CTRL+C oder mit kill -2 prozessnummer abgebrochen werden. |
Beispiel 2
Das Kommando trap in einer Dialog-Shell:
Hier wird vereinbart, dass bei Beendigung der aktuellen Shell eine Meldung in die Datei $HOME/logdatei geschrieben werden soll. Die Kommandoliste muss in Hochkommas eingeschlossen sein, damit das Kommando date erst bei Beendigung der Shell ausgeführt wird. |
Beispiel 3
Die Shell-Prozedur traptest zeigt, wie temporäre Dateien gelöscht werden sollten, falls Signale während des Ablaufes eintreffen. Sie enthält die folgenden Zeilen, allerdings ohne Zeilennummern: 1 TMP=/usr/rtmp/$$ 2 trap "rm -f $TMP; trap 0; exit 1" 1 2 3 15 3 trap "rm -f $TMP; exit 0" 0 4 ls > $TMP . . . Zeile 1: Der Variablen TMP wird der Dateiname /usr/rtmp/$$ zugewiesen. Die Shell ersetzt $$ durch die Prozessnummer der aktuellen Shell. Deshalb ist der Dateiname eindeutig. Zeile 2: Die Kommandoliste ist in Anführungszeichen eingeschlossen, weil der Variablen TMP bereits ein Wert zugewiesen ist. Für die Signale 1, 2, 3 und 15 ist folgende Reaktion vereinbart: Die Datei /usr/rtmp/$$ wird gelöscht, die Vereinbarung für das Ende der Prozedur (0) wird rückgängig gemacht (siehe Zeile 3) und die Prozedur mit Endestatus 1 abgebrochen. Zeile 3: Als einzige Signalnummer ist 0 angegeben, d.h. für das Ende der Prozedur ist vereinbart: Die Datei /usr/rtmp/$$ wird gelöscht und die Prozedur mit Endestatus 0 beendet. Diese Vereinbarung muss in Zeile 2 mit trap 0 zurückgesetzt werden, denn das Kommando exit beendet die Prozedur-Shell (0). Laut Vereinbarung in Zeile 3 wäre aber dann der Endestatus 0. Zeile 4: Hier wird die Datei /usr/rtmp/$$ angelegt. Diese Zeile darf nicht vor den trap-Kommandos stehen. Wenn nämlich die Prozedur bereits unterbrochen wird, bevor die Shell das erste trap-Kommando ausgeführt hat, würde die Datei nicht gelöscht. Die Kommandoliste sollte in diesem Fall mit dem Kommando exit enden, da sonst möglicherweise die restlichen Kommandos der Prozedur in einem undefinierten Zustand ausgeführt werden. |
Siehe auch
exit, kill signal() [4] |