Aus LinuxUser 11/2014

Über Signale Prozesse in der Shell steuern

© Kirsty Pargeter, 123RF

Klar signalisiert

Statt Prozesse einfach abzuschießen, fangen Profis deren Kommunikation geschickt ab und lenken mit den passenden Signalen die Arbeit des Rechners gekonnt in die gewünschte Richtung.

Meist kommt der Befehl kill als letztes Mittel der Wahl zum Einsatz: Sofort und ohne Pardon beenden Sie damit einen Prozess. Meist setzen Sie dazu das Kommando kill -9 Prozess-ID ab. Als Option übermitteln Sie das Signal 9, als Argument die Prozess-ID (PID), welche Sie meist aus der Ausgabe des Kommandos ps erhalten. Aber das ist nur eine der Möglichkeiten, die der Mechanismus bietet.

Signale

Die unter Linux gebräuchlichen Signale finden Sie in der Tabelle „Signale“. Verwandte Systeme wie FreeBSD oder Solaris zeigen hier Abweichungen. Bei allen Systemen sind nur die Signale 1, 3, 9 und 15 identisch. Welche das von Ihnen verwendete System unterstützt, erfahren Sie mittels kill -l im Terminal. Den Befehl kill können Sie in der Form kill -ZahlPID oder kill -SignalnamePID anwenden. Beim Einsatz des Signalnamens verwenden Sie den Namen ohne vorangestelltes SIG.

Für einige Beispiele dient daemon.sh aus Listing 1 als Ziel für die Signale. Das Programm zeigt in einer Schleife seinen Shell-Aufruf, die eigene PID und die Prozess-ID des Elternprozess (PPID) an.

Listing 1

#! /bin/sh
while true;
do
echo $0 $$ $PPID
sleep 1
done

Signale

Nummer Signal Wirkung Beispiel/Hinweis
1 SIGHUP Trennt den Kind- vom Elternprozess Beendet Prozess
2 SIGINT Beendet Prozess Entspricht [Strg]+[C]
3 SIGQUIT Beendet Prozess Prozess Darf Core-Dump erstellen
4 SIGILL Beendet Prozess nach falschem Aufruf (Rechtemangel, unbekannte Funktionen)
5 SIGTRAP Beendet Prozess fordert Trace/Debugger an (geht vom Prozess selbst aus)
6 SIGABRT Beendet Prozess (geht vom Prozess selbst aus)
7 SIGBUS Beendet Prozess Aufruf durch System nach Speicherzugriffsfehler
8 SIGFPE Beendet Prozess Bei Division durch 0
9 SIGKILL Beendet Prozess Schreibt keine Dateien mehr, Gefahr von Datenverlust
10 SIGUSR1 Benutzerdefiniertes Signal
11 SIGSEGV Beendet Prozess Nach Speicherzugriffsfehler
12 SIGUSR2 Benutzerdefiniertes Signal
13 SIGPIPE Beendet Prozess Problem mit einer Pipe
14 SIGALRM Beendet Prozess Nach Timer-Ablauf
15 SIGTERM Beendet Prozess Prozess schreibt Dateien zurück
16 SIGSTKFLT Beendet Prozess Nach Stack-Fehler am Co-Prozessor
17 SIGCHLD Beendet Kindprozess Geht vom Elternprozess aus
18 SIGCONT Setzt gestoppten Prozess fort
19 SIGSTOP Hält Prozess an
20 SIGTSTP Hält Prozess an entspricht [Strg]+[Z]

Sanft entfernt

In der Grundform beenden Sie einen Prozess mit SIGHUP. Dabei geht das System so vor, als hätten Sie das betreffende Terminal beendet. Umgekehrt verhindern Sie genau dies, indem Sie beim Programmstart ein nohup voranstellen. Damit läuft die Anwendung weiter, obwohl Sie sich anschließend abmelden, wie bei einer Sitzung via SSH.

Solange niemand etwas gegen den Prozess unternimmt oder den Rechner abschaltet, läuft das Skript, bis es von sich aus terminiert. Die Ausgabe lesen Sie in der Protokolldatei nohup.out, deren Inhalt Sie mittels tail -f nohup.out mitverfolgen.

Auf die gleiche Weise starten Sie bei Bedarf die meisten Daemons im System neu: kill -HUP Daemon-PID. Es empfiehlt sich aber trotzdem, das für den Daemon vorgesehene Init-Skript beziehungsweise den Start/Stop-Mechanismus des Systems zu verwenden.

Bei Bedarf halten Sie Prozesse an, um für den weiteren Verlauf notwendige Ressourcen bereitzustellen. Im Beispiel läuft das Skript daemon.sh und nach einigen Durchgängen erhält es das Signal 19. Das hält den Prozess an. Mittels kill -18 PID setzen Sie dessen Arbeit fort (Abbildung 1).

Abbildung 1: Starten, Anhalten und Fortsetzen eines Prozesses.
Abbildung 1: Starten, Anhalten und Fortsetzen eines Prozesses.

Signale abfangen

Es gibt keine Möglichkeit, die Signale SIGKILL und SIGSTOP per Trap abzufangen, zu blockieren oder zu ignorieren. Alle anderen dürfen Sie innerhalb von Shell-Skripten nutzen, um eine abweichende Reaktion zu erzeugen. Das Trap-Kommando bauen Sie in der Form trap 'Reaktion' Signale in ein Shell-Skript ein.

Die Zeile trap '' 2 ignoriert ein Signal. Ohne Option und Reaktion liefert es bei fast allen Signalen beim Beenden des Shell-Skripts deren Bezeichnung. Das Signal 10 bricht das Skript aus Listing 2 mit der Ausgabe [2]+ Benutzerdefiniertes Signal 1 ./anzeige.sh ab. Die nutzbaren Signale zeigt trap -l an.

Listing 2

#! /bin/sh
trap
while true; do
clear
echo $0 $$
sleep 1
done
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
KAUFEN
LinuxUser 11/2014 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: