Bash Signalverarbeitung

Aus xinux.net
Zur Navigation springen Zur Suche springen

Worum geht es?

  • In Bash können Signale, die von einem Betriebssystem oder einer anderen Quelle gesendet werden, behandelt werden.
  • Die Signalbehandlung in Bash erfolgt durch die Verwendung des Befehls "trap", gefolgt von einem Signalnamen und einer Aktion, die bei Empfang des Signals ausgeführt werden soll.
  • Die Aktion kann ein Befehl, eine Funktion oder eine Codezeile sein, die spezifische Aufgaben erfüllt, wenn das Signal empfangen wird, wie beispielsweise das Beenden des Skripts oder das Ignorieren des Signals.
  • Es gibt verschiedene Arten von Signalen, wie z.B. das Signal SIGINT (Interrupt-Signal), das durch das Drücken von Ctrl+C erzeugt wird.
  • Durch die Signalbehandlung können Shell-Skripte auf solche Ereignisse reagieren und das gewünschte Verhalten ausführen, um die Ausführung des Skripts zu steuern.

Signale bei der Programmierung der Bash

  • Es existieren verschiedene Möglichkeiten, auf welchem Wege Signale gesendet werden können:

von außen

  • Benutzer (< DEL >, < CTRL >|, etc.)
  • Prozesse (kill, alarm)

von innen

  • Programmfehler (Adressfehler, ungültiger Befehl, Division durch 0, etc.)

Signale dienen der Interprozesskommunikation. Diese Nachrichten beschränken sich allerdings auf die Übertragung eines einzigen Wertes.

Von den Befehlen trap und kill werden folgende Signale verwendet:

Signalnummer Bedeutung
0 Beenden von bash
SIGHUP 1 Logoff von einer Datensichtstation
SIGINT 2 Drücken der Taste < DEL >
SIGQUIT 3 Drücken der Taste < CTRL > + c
SIGKILL 9 kill: unbedingter Prozessabbruch
SIGTERM 15 Programmbeendigung

Reaktion eines Prozesses auf den Empfang eines Signals

  • Der Prozess beendet sich (meist Standardeinstellung).
  • Der Prozess ignoriert das Signal. (Ausnahme: SIGKILL)
  • Der Prozess fängt das Signal ab, d.h. er leitet eine selbst definierte Reaktion ein.

Der Befehl trap

Funktionen:

Signalbehandlung setzen

(Nach Beendigung der bash werden die betreffenden temporären Dateien gelöscht)

  • trap 'rm *.tmp' 0
  • trap 'who; exit 1' 2 3

Liefern von Informationen über gesetzte Signalbehandlung

  • trap

Zurücksetzen der Signalbehandlung

  • trap 2 3

Import von Signalen

  • trap : 2 3
  • trap 2 3

Demonstriert die Funktion trap zum Abfangen von Signalen

#!/bin/bash
trap 'echo trap ausgelöst' 2
i=0
while [ $i -lt 5 ]
do
   echo "Bitte nicht stören!"
   sleep 2
   i=`expr $i + 1`
done

Bemerkung: Die Signalbehandlung selbst wird nicht an Kindprozesse weitervererbt. Das Ignorieren von Signalen hingegen wird weitervererbt.

Aufgaben