Trap

Aus Foxwiki

topic - Kurzbeschreibung

Beschreibung

Installation

Syntax

Parameter

Optionen

Konfiguration

Anwendung

Links

Dateien

Man-Page

Intern

Weblinks

Kontrollfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5

trap

trap 'Kommandoliste' Signale
  • Ausführen der Kommandoliste, wenn eins der angegebenen Signale an den Prozeß (= Shell) gesendet wird.
  • Die Signale werden in Form der Signalnummern oder über ihre Namen (SIGKILL, SIGHUP, ...), getrennt durch Leerzeichen aufgeführt.
  • Ist die Kommandoliste leer, werden die entsprechenden Signale abgeschaltet. Bei einfachen Kommandos reichen oft auch die Anführungszeichen, um die Shell-Ersetzung zu verhindern.
  • Signale sind eine Möglichkeit, wie verschiedenen Prozesse, also gerade laufende Programme, miteinander kommunizieren können.
  • Ein Prozeß kann einem anderen Prozeß ein Signal senden (der Betriebssystemkern spielt dabei den Postboten).
  • Der Empfängerprozeß reagiert auf das Signal, z. B.  dadurch, dass er sich beendet. Der Prozeß kann das Signal auch ignorieren.
  • Das ist beispielsweise nützlich, wenn ein Shellskript nicht durch den Benutzer von der Tastatur aus abgebrochen werden soll.
  • Mit dem trap-Kommando kann man festlegen, mit welchen Kommandos auf ein Signal reagiert werden soll bzw. ob überhaupt reagiert werden soll.

Neben anderen können folgende Signalnummern verwendet werden:

0 SIGKILL Terminate (beim Beenden der shell)
1 SIGHUP Hangup (beim Beenden der Verbindung zum Terminal oder Modem)
2 SIGINT Interrupt (wie Strg-C-Taste am Terminal)
3 SIGQUIT Abbrechen (Beenden von der Tastatur aus)
9 SIGKILL Kann nicht abgefangen werden - Beendet immer den empfangenden Prozeß
15 SIGTERM Terminate (Software-Terminate, Voreinstellung)

Eine Liste aller Signale gibt folgendes Kommando aus:

kill -l

Beispiele

# Skript sperren gegen Benutzerunterbrechung:
trap "" 2 3

oder auch

# Skript sauber beenden
trap 'rm tmpfile; cp foo fileb; exit' 0 2 3 15

Bitte nicht das exit-Kommando am Schluss vergessen, sonst wird das Skript nicht beendet.

Wiedereinschalten der Signale erfolgt durch trap [Signale]. Ein letztes Beispiel zu trap:

# Automatisches Ausführen des Shellskripts .logoff beim
# Ausloggen durch den folgenden Eintrag in .profile:
trap .logoff 0

trap

  • Viele Programme lassen sich während der Laufzeit über bestimmte Signale beenden oder unterbrechen (bspw. schießt [Strg]+[C] fast jedes Programm ab).
  • »trap« kann nun auf zwei Arten verwendet werden.
  • Zum einen kann ein Signal (außer SIGKILL, Nr. 9) von der Behandlung durch die Bash ausgeschlossen werden.

Dazu lässt man trap ein paar leerer Anführungsstriche und die Liste der zu ignorierenden Signalnummern (die Nummern erhält man mit "kill -l") folgen:

sleep 100
[Strg]+[C]   # Sofortiger Abbruch durch Signal SIGINT (Nr.2)

trap "" 2
'# Die Bash interessiert sich nun nicht mehr für SIGINT: sleep 100
[Strg]+[C]   # Kein Abbruch

Die ursprüngliche Bedeutung eines Signals kann durch die Angabe von »trap Signalnummer« wieder hergestellt werden.

Die zweite Verwendung von »trap« erlaubt die Verbindung von Kommandos mit bestimmten Signalen. Trifft ein solches ein, wird das vereinbarte Kommando aufgerufen:

trap 'echo "SIGINT empfangen"' 2
[Strg]+[C]SIGINT empfangen


trap ist somit für Shellskripte interessant, die mit temporären Dateien arbeiten, um diese bei Abbruch durch ein Signal ordnungsgemäß aufräumen zu können.

Die Option -p bringt alle von trap veränderten Signale mit ihrer Belegung zum Vorschein.