Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Signale werden zur Steuerung von Prozessen verwendet. Ein Signal ist ein asynchrones Ereignis, das eine Unterbrechung (Interrupt) auf der Prozessebene bewirken kann. Es handelt sich dabei um ein einfaches Kommunikationsmittel zwischen zwei Prozessen, Prozess_1
sendet dem Prozess_2
eine Nachricht. Bei den versendeten Nachrichten selbst handelt es sich um einfache, ganze Zahlen, die aber auch als symbolische Namen (Alphawert) gesendet werden können.
Programme zur Signalsteuerung findet man im Wiki unter Befehlsübersicht bei Prozesssteuerung und Systemüberwachung. Diese Programme erkennen alle den numerischen oder den symbolischen Wert (z.B. -15
, -TERM
oder -SIGTERM
).
Programme können jedes Signal abfangen (außer SIGKILL und -SIGSTOP
). Dadurch kann auf Fehlermeldungen oder ein Ende-Signal reagiert werden, um ein "sauberes" abschließen von Dateien und ein löschen von temporären Dateien einzuleiten (abhängig vom Programmierer).
Die Shells wie die Bash und damit auch selbst erstellte Skripte kennen die Behandlung von Signalen.
Das eingebaute Kommando trap
ist in der Lage Signale abzufangen, Information dazu findet man in den entsprechenden Dokumentationen/Foren zur Shell-Programmierung.
Ein
Strg +
C im Terminal (Prozess_1
) sendet ein -SIGINT
(2) an ein vorher gestartetes Programm (Prozess_2
) um es zu beenden.
Ein
Strg +
Z im Terminal sendet ein -SIGSTOP
(19) an ein vorher gestartetes Programm um es zu pausieren.
Ein bg %jobnummer
verschiebt das Programm in den Hintergrund und sendet ein -SIGCONT
(18) um das Programm fortzusetzen.
Ein kill -SIGUSR1
(10) bei langen Datensicherungen mit dd gibt im Terminal die bisher kopierte Datenmenge aus.
Wenn ein Terminal geschlossen wird, dann sendet es ein -SIGHUP
(1) an alle noch laufenden Programme und sie brechen ab.
Weiter Funktion der Signale können die Synchronisation, das Ausführen von im Programm definierten Aktionen (z.B. Konfigurationsdatei neu einlesen) oder auch nur Kommunikation untereinander sein.
Generell kann man die Signale in 3 Hauptgruppen einteilen:
Systemsignale, wie Hardware- und Systemfehler (-ILL, -TRAP, -BUS, -FPE,
-KILL, -SEGV, -XCPU, -XFSZ, -IO ...
)
Gerätesignale (-HUP, -INT, -PIPE, -ALRM, -CHLD, -CONT, -STOP, -TTIN, -TTOU, -URG, -WINCH, -IO ...
)
Benutzersignale (-QUIT, -ABRT, -USR1, -USR2,
-TERM ...
)
Allein die Bash unterstützt über 60 verschiedene Signale die hier nicht alle aufgezeigt werden können, daher zwei ausgewählte Aufzählungen getrennt nach einfacher Signalliste für den Tagesgebrauch und einer erweiterten Signalliste für Kenner.
Dem normalen Beenden von Prozessen mit -SIGTERM
(15) ist immer der Vorzug zu geben, weil dadurch dem Programm noch die Möglichkeit gegeben wird sich "anständig" zu beenden. Erst wenn ein -SIGTERM
(15) nicht angenommen wird kann man den Kernel mit einem -SIGKILL
(9) beauftragen den Prozess zu debuggen (Dump) und hart abzubrechen. Die empfangenden Programme können ein -SIGKILL
(9) ebenso wie ein -SIGSTOP
(19) nicht abfangen um programmspezifische Aktionen durchzuführen.
Die Signalnummer 0 hat keinen symbolischen Namen und dient lediglich der Abfrage ob ein Prozess läuft oder nicht. Zu beachten ist dabei, dass die PID in einem Rotationsverfahren vergeben wird und man nie sicher sein kann ob der Prozess noch läuft und mit der PID verbunden ist.
Signale zur Prozesskontrolle durch den "normalen" Benutzer | ||||
Nr. | Name | Aktion | Bemerkung | |
1 | SIGHUP | Ende | Trennen der Terminalverbindung, siehe auch Terminal schließen. | |
2 | SIGINT | Ende | Unterbrechen der Terminalverbindung, siehe auch Strg+C. | |
3 | SIGQUIT | Dump & Ende | Unterbrechen der Terminalverbindung und debuggen. | |
9 | SIGKILL | Dump & Ende | Senden Abbruch und debuggen durch den Kernel, siehe auch Wichtig. | |
10 | SIGUSR1 | Intern | Frei zur eigenen Benutzung, sofern in den Programmen integriert, siehe auch Fortschritt von dd abfragen. | |
12 | SIGUSR2 | Intern | Frei zur eigenen Benutzung, sofern in den Programmen integriert. | |
15 | SIGTERM | Ende | Standard bei allen kill -Programmen: Abschließen und beenden des Programms. | |
18 | SIGCONT | Restart | Ein mit -SIGSTOP (19) angehaltener Prozess soll weiterlaufen, siehe auch bg %jobnummer. | |
19 | SIGSTOP | Anhalten | Der Prozess wird pausiert und kann mit -SIGCONT (18) wieder gestartet werden. |
erweiterte Liste der Signale. | ||||
Nr. | Name | Aktion | Bemerkung | |
4 | SIGILL | Core & Ende | Ungültige Instruktion wurde ausgeführt. | |
5 | SIGTRAP | Core & Ende | Unterbrechung (Einzelschrittausführung). | |
6 | SIGABRT | Core & Ende | Abnormale Beendigung. | |
7 | SIGBUS | Core & Ende | Fehler auf dem System-Bus. | |
8 | SIGFPE | Core & Ende | Problem bei einer Gleitkommaoperation, z.B. Teilung durch Null. | |
11 | SIGSEGV | Core & Ende | Speicherzugriff auf unerlaubtes Speichersegment. | |
13 | SIGPIPE | Ende | Es wurde in eine Pipe geschrieben/versuch mit O_NONBLOCK zu schreiben, aus der niemand liest. | |
14 | SIGALRM | Ende | Zeituhr ist abgelaufen – alarm(). | |
17 | SIGCHLD | Ignoriert | Der Kind-Prozess wurde beendet oder angehalten. | |
20 | SIGTSTP | Anhalten | Der Prozess wurde »von Hand« mit STOP angehalten. | |
21 | SIGTTIN | Anhalten | Prozess wollte aus einem Hintergrundprozess der Kontroll-Dialogstation lesen. | |
22 | SIGTTOU | Anhalten | Prozess wollte in einem Hintergrundprozess der Kontroll-Dialogstation schreiben. | |
27 | SIGPROF | Ende | Timer zur Profileinstellung ist abgelaufen. | |
28 | SIGWINCH | Ignoriert | Window-Größe hat sich verändert. | |
31 | SIGSYS | Core & Ende | Ungültiges Argument bei System-Call. |
Prozesssteuerung im Terminal
kill Beenden von Prozessen mit der Prozess-ID
pkill Beenden von Prozessen nach dem Namen/regulärem Ausrdruck
nohup Lösen von Prozessen aus der Terminal-Sitzung
Prozesse, Tasks und Threads - "Linux. Das umfassende Handbuch", von Johannes Ploetner und Steffen Wendzel, Rheinwerk <openbook>
Diese Revision wurde am 19. April 2015 12:40 von aasche erstellt.