trap(1) trap(1)
NAME
trap - Signalbehandlung ändern
SYNTAX
trap[ kommandoliste] signalnummer ... Format 1
trap Format 2
BESCHREIBUNG
Mit dem in die Shell sh(1) bzw. ksh(1) eingebauten Kommando trap kön-
nen 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 (Format
1):
- 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 (Format 2).
Format 1: Signalbehandlung ändern
trap[ kommandoliste] signalnummer ...
kommandoliste
legt fest, wie die Shell auf die nachfolgend angegebenen Signale
reagieren soll, ob sie also
- Kommandos ausführen soll, wenn das angegebene Signal ein-
trifft,
- das angegebene Signal ignorieren soll, oder
- auf das angegebene Signal wieder standardmäßig reagieren soll.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
trap(1) trap(1)
Kommandos ausführen
Für kommandoliste geben Sie ein oder mehrere Kommandos (z. B.
trap pwd 2) an. Diese Kommandos sollen ausgefü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 muß ein einziges Argument sein. Sobald in die-
ser Liste Argument-Trennzeichen oder Strichpunkte enthalten sind,
müssen Sie kommandoliste in Hochkommas '...' bzw. Anführungszei-
chen "..." einschließen.
Wenn die angegebene kommandoliste nicht die leere Zeichenkette
ist, gilt die so vereinbarte Signalbehandlung nur in der aktuel-
len Shell. In jeder Subshell muß diese mit trap neu vereinbart
werden; andernfalls gilt die Standard-Behandlung.
Beachten Sie dabei, daß die Shell die angegebenen Kommandos zwei-
mal 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 Aus-
fü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, daß die Shell-Prozedur nach dem Ein-
treffen 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 kommando-
liste bedeutet, daß die angegebenen Signale ignoriert werden
(z. B. trap "" 2).
Die entsprechenden Signale werden auch in jeder Subshell igno-
riert.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
trap(1) trap(1)
Signalbehandlung auf den Standard zurücksetzen
Wenn Sie kommandoliste nicht angeben (z. B. trap 2), reagiert die
Shell auf die angegebenen Signale wieder standardmäßig.
signalnummer
Nummer des Signals, auf das die Shell wie angegeben reagieren
soll [siehe signal(5)]. Sie können mehrere Signalnummern angeben,
jeweils getrennt durch Leerzeichen. Sobald eines dieser Signale
eintrifft, wird kommandoliste ausgeführt.
In der Korn-Shell ksh können Sie anstelle der Signalnummern auch
die Signalnamen angeben.
Sinnvolle Angaben für die Shell sind:
_________________
| 0 | EXIT |
|_____|__________|
| 1 | SIGHUP |
|_____|__________|
| 2 | SIGINT |
|_____|__________|
| 3 | SIGQUIT |
|_____|__________|
| 6 | SIGABRT |
|_____|__________|
| 9 | SIGKILL |
|_____|__________|
| 14 | SIGALRM |
|_____|__________|
| 15 | SIGTERM |
|_____|__________|
Die Angabe 0 für signalnummer bewirkt, daß die angegebene komman-
doliste 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.
Die Angabe 11 (SIGSEGV) ist bei trap nicht erlaubt.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
trap(1) trap(1)
Format 2: Geänderte Signalbehandlung ausgeben
trap 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
bzw. in der Korn-Shell ksh:
trap -- kommandoliste signal
Es werden aber nur die Signalnummern ausgegeben, für die Sie mit
dem Kommando trap vorher eine Behandlung abweichend vom Standard
vereinbart haben.
Signalbehandlung in der Shell
Ein Prozeß kann jederzeit ein Signal erhalten, das entweder er selbst,
ein anderer Prozeß, oder der Benutzer an der Datensichtstation z. B.
durch DEL 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 Shell sind folgende Signale von Bedeutung:
______________________________________________________________________
| Signal-| | |
| Nummer | Signal | Ursache |
|________|__________|_________________________________________________|
| 1 | SIGHUP | Verbindung zur Datensichtstation ist unterbro- |
| | | chen |
|________|__________|_________________________________________________|
| 2 | SIGINT | Taste DEL |
|________|__________|_________________________________________________|
| 3 | SIGQUIT | Tasten CTRL-\ |
|________|__________|_________________________________________________|
| 9 | SIGKILL | Kommando kill -9 PID; PID ist die Prozeß-Nummer|
| | | der entsprechenden Shell |
|________|__________|_________________________________________________|
| 15 | SIGTERM | Kommando kill -15 PID; PID ist die Prozeß- |
| | | Nummer der entsprechenden Shell |
|________|__________|_________________________________________________|
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
trap(1) trap(1)
INTERNATIONALE UMGEBUNG
Die Umgebungsvariable LCMESSAGES bestimmt die Sprache der Meldungs-
texte. Wenn LCMESSAGES nicht oder als leere Zeichenkette definiert
ist, wird der Wert von LANG als Standardwert herangezogen. Ist auch
LANG nicht oder als leere Zeichenkette definiert, verhält sich das
System so, als wäre es nicht internationalisiert.
Die Umgebungsvariable LCALL bestimmt die gesamte internationale Umge-
bung. LCALL hat Vorrang vor allen anderen Umgebungsvariablen im
Bereich der Internationalisierung.
BEISPIELE
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, daß das
Signal 2 ignoriert wird. Die Shell-Prozedur kann also nicht von außen
durch DEL 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-D
.
.
.
login: rosa
Password:
$ cat logdatei
Zuletzt abgemeldet: Wed Mar 20 22:17:23 MEZ 1991
Hier wird vereinbart, daß bei Beendigung der aktuellen Shell eine Mel-
dung in die Datei $HOME/logdatei geschrieben werden soll. Die Komman-
doliste muß 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 wer-
den sollten, falls Signale während des Ablaufes eintreffen. Sie ent-
hält die folgenden Zeilen, allerdings ohne Zeilennummern:
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
trap(1) trap(1)
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 Prozeß-Nummer 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än-
gig gemacht (siehe Zeile 3) und die Prozedur mit Ende-Status 1 abge-
brochen.
Zeile 3:
Als einzige Signalnummer ist 0 angegeben, d. h. für das Ende der Pro-
zedur ist vereinbart: Die Datei /usr/rtmp/$$ wird gelöscht und die
Prozedur mit Ende-Status 0 beendet. Diese Vereinbarung muß 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
Ende-Status 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 unterbro-
chen 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.
HINWEISE
Bei der Verwendung von trap können sich Abweichungen im Verhalten
ergeben, je nachdem, welche Shell benutzt wird. Die möglichen Abwei-
chungen sind nicht eigens beschrieben.
SIEHE AUCH
exit(1), kill(1), ksh(1), sh(1), signal(5).
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98