Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

trap - Signalbehandlung ändern

&pagelevel(4)&pagelevel

(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 ...]

kommandoliste

legt fest, wie die Shell auf die nachfolgend angegebenen Signale reagieren soll, ob sie also

  • Kommandos ausführen soll, wenn das angegebene Signal eintrifft,

  • das angegebene Signal ignorieren soll, oder

  • auf das angegebene Signal wieder standardmäßig reagieren soll.

Kommandos ausführen

Fü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:

  • Das erste Mal, wenn die Shell trap ausführt.

  • Das zweite Mal, wenn das entsprechende Signal eintrifft und die Shell die vereinbarten Kommandos ausführt.

Deshalb haben Hochkommas und Anführungszeichen unterschiedliche Bedeutung:

'kommandoliste'
Die Shell interpretiert die Sonderzeichen erst bei der Ausführung der Kommandos. Shell-Variablen werden also erst bei der Ausführung durch ihren Wert ersetzt.

"kommandoliste"
Die Shell interpretiert die Zeichen $, \ und ` ...` bereits beim Ausführen von trap. Oft sind aber zu diesem Zeitpunkt Shell-Variablen noch nicht definiert.

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 ignorieren

Die 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ücksetzen

Wenn Sie kommandoliste nicht angeben, reagiert die Shell auf die angegebenen Signale wieder standardmäßig (siehe Abschnitt „Signalbehandlung in der Shell“).

signalnummer | signalname

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:
0 / EOF (Beendigung der Shell)
1 / SIGHUP
2 / SIGINT
3 / SIGQUIT
15 / SIGTERM

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:

  • Wenn Sie trap im Dialog aufgerufen haben, wird kommandoliste ausgeführt, sobald Sie CTRL+D drücken.

  • Wenn trap in einer Shell-Prozedur steht, wird kommandoliste nach der Ausführung dieser Prozedur ausgeführt.

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:

  • er ignoriert das eintreffende Signal.

  • er bricht ab.

  • er ruft eine Funktion auf, in der dieses Signal behandelt wird.

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
PSH: abbrechen

Signal-Nummer 2

DS: vereinbarte Signalbehandlung nach dem nächsten Kommando oder nach Betätigung der Eingabetaste ausführen, sonst: ignorieren
PSH: ignorieren

Signal-Nummer 3

DS: vereinbarte Signalbehandlung nach dem nächsten Kommando oder nach Betätigung der Eingabetaste ausführen, sonst: ignorieren
PSH: ignorieren

Signal-Nummer 9

DS: abbrechen
PSH: abbrechen

Signal-Nummer 15

DS: ignorieren
PSH: 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-Prozedur

kill -1 PID

ShP: bricht sofort ab
VgP: läuft weiter

kill -2 PID

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: läuft weiter

CTRL+C

ShP: bricht sofort ab
VgP: bricht sofort ab

kill -3 PID

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: läuft weiter

CTRL+\

ShP: bricht sofort ab
VgP: bricht sofort ab, core-dump wird auf Platte geschrieben

kill -9 PID

ShP: bricht sofort ab
VgP: läuft weiter

kill -15 PID

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: läuft weiter

Keine Vereinbarung für Shell-Prozedur; Vereinbarung für aktuellen Vordergrundprozess der Shell-Prozedur

kill -1 PID

ShP: bricht sofort ab
VgP: läuft weiter

kill -2 PID

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: führt Vereinbarung aus

CTRL+C

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: führt Vereinbarung aus

kill -3 PID

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: führt Vereinbarung aus

CTRL+\

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: führt Vereinbarung aus

kill -9 PID

ShP: bricht sofort ab
VgP: läuft weiter

kill -15 PID

ShP: bricht nach normaler Beendigung des Vordergrundprozesses ab
VgP: führt Vereinbarung aus

Vereinbarung für Shell-Prozedur; keine Vereinbarung für aktuellen Vordergrundprozess der Shell-Prozedur

kill -1 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

kill -2 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

CTRL+C

ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: bricht sofort ab

kill -3 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

CTRL+\

ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: bricht sofort ab, core-dump wird auf Platte geschrieben

kill -9 PID

ShP: bricht sofort ab
VgP: läuft weiter

kill -15 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

Vereinbarung für Shell-Prozedur und aktuellen Vordergrundprozess der Shell-Prozedur

kill -1 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

kill -2 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

CTRL+C

ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: Ausführung der Vereinbarung; danach Fort setzung des Ablaufs

kill -3 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)

CTRL+\

ShP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs

kill -9 PID

ShP: bricht sofort ab
VgP: läuft weiter

kill -15 PID

ShP: nach normaler Beendigung des Vordergrundprozesses Ausführung der Vereinbarung; danach Fortsetzung des Ablaufs
VgP: läuft weiter
(Signal wird nicht zugestellt)


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:

$ trap 'echo Zuletzt abgemeldet: `date` >>$HOME/logdatei' 0

$ trap

0, echo Zuletzt abgemeldet: `date` >>$HOME/logdatei

$ CTRL+C

...

login: rosa

Password:

$ cat logdatei

Zuletzt abgemeldet: Mon Mar 9 18:17:23 MEZ 2009

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]