ubuntuusers.de

Signale

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Wiki/Icons/terminal.png 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

  • 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.

Beispiele

  • 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.

Signalarten

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.

Wichtig

Achtung!

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.

Einfache Signalliste

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 Signalliste

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.

Diese Revision wurde am 19. April 2015 12:40 von aasche erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Prozesse, System, Shell, PID