[[Vorlage(getestet, general)]] [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] Signale werden zur Steuerung von Prozessen verwendet. Ein Signal ist ein asynchrones Ereignis, das eine Unterbrechung (Interrupt) auf der [:Prozesse: 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 [:Shell/Befehlsübersicht: Befehlsübersicht] bei [:Shell/Befehlsübersicht#Prozesssteuerung: Prozesssteuerung] und [:Shell/Befehlsübersicht#Systemueberwachung: 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 [#Wichtig 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 [:Shell: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 [[Vorlage(Tasten, CTRL+C)]] im Terminal (`Prozess_1`) sendet ein `-SIGINT` (2) an ein vorher gestartetes Programm (`Prozess_2`) um es zu beenden. * Ein [[Vorlage(Tasten, CTRL+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 [:Shell/dd: 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, `[#Wichtig -KILL]`, -SEGV, -XCPU, -XFSZ, -IO ...`) * Gerätesignale (`-HUP, -INT, -PIPE, -ALRM, -CHLD, -CONT, -STOP, -TTIN, -TTOU, -URG, -WINCH, -IO ...`) * Benutzersignale (`-QUIT, -ABRT, -USR1, -USR2, `[#Wichtig -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 == {{{#!vorlage Warnung 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 == {{{#!vorlage Tabelle <-5 rowclass="titel"> Signale zur Prozesskontrolle durch den "normalen" Benutzer +++ Nr. Name Aktion Bemerkung +++ <)>1 SIGHUP Ende Trennen der Terminalverbindung, siehe auch [#Beispiele Terminal schließen]. +++ <)rowclass="highlight"> 2 SIGINT Ende Unterbrechen der Terminalverbindung, siehe auch [#Beispiele Strg+C]. +++ <)>3 SIGQUIT Dump & Ende Unterbrechen der Terminalverbindung und debuggen. +++ <)rowclass="highlight"> 9 SIGKILL Dump & Ende Senden Abbruch und debuggen durch den Kernel, siehe auch [#Wichtig Wichtig]. +++ <)>10 SIGUSR1 Intern Frei zur eigenen Benutzung, sofern in den Programmen integriert, siehe auch [#Beispiele Fortschritt von dd abfragen]. +++ <)rowclass="highlight"> 12 SIGUSR2 Intern Frei zur eigenen Benutzung, sofern in den Programmen integriert. +++ <)>15 SIGTERM Ende Standard bei allen [:Shell/Befehlsübersicht#Systemueberwachung:`kill`-Programmen]: Abschließen und beenden des Programms. ++++ <)rowclass="highlight"> 18 SIGCONT Restart Ein mit `-SIGSTOP` (19) angehaltener Prozess soll weiterlaufen, siehe auch [#Beispiele bg %jobnummer]. +++ <)>19 SIGSTOP Anhalten Der Prozess wird pausiert und kann mit `-SIGCONT` (18) wieder gestartet werden. }}} == Erweiterte Signalliste == {{{#!vorlage Tabelle <-5 rowclass="titel"> erweiterte Liste der Signale. +++ Nr. Name Aktion Bemerkung +++ <)rowclass="highlight"> 4 SIGILL Core & Ende Ungültige Instruktion wurde ausgeführt. +++ <)>5 SIGTRAP Core & Ende Unterbrechung (Einzelschrittausführung). +++ <)rowclass="highlight"> 6 SIGABRT Core & Ende Abnormale Beendigung. +++ <)>7 SIGBUS Core & Ende Fehler auf dem System-Bus. +++ <)rowclass="highlight"> 8 SIGFPE Core & Ende Problem bei einer Gleitkommaoperation, z.B. Teilung durch Null. +++ <)>11 SIGSEGV Core & Ende Speicherzugriff auf unerlaubtes Speichersegment. +++ <)rowclass="highlight"> 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(). +++ <)rowclass="highlight"> 17 SIGCHLD Ignoriert Der Kind-Prozess wurde beendet oder angehalten. +++ <)>20 SIGTSTP Anhalten Der Prozess wurde »von Hand« mit STOP angehalten. +++ <)rowclass="highlight"> 21 SIGTTIN Anhalten Prozess wollte aus einem Hintergrundprozess der Kontroll-Dialogstation lesen. +++ <)>22 SIGTTOU Anhalten Prozess wollte in einem Hintergrundprozess der Kontroll-Dialogstation schreiben. +++ <)rowclass="highlight"> 27 SIGPROF Ende Timer zur Profileinstellung ist abgelaufen. +++ <)>28 SIGWINCH Ignoriert Window-Größe hat sich verändert. +++ <)rowclass="highlight"> 31 SIGSYS Core & Ende Ungültiges Argument bei System-Call. }}} = Links = * [:Shell/Prozesssteuerung: Prozesssteuerung] im Terminal * [:Shell/Befehlsübersicht: Befehlsübersicht] * [:Shell/Befehlsübersicht#Systemueberwachung: Befehle zur Systemüberwachung] * [:Shell/Befehlsübersicht#Prozesssteuerung:Befehle zur Prozesssteuerung] * [: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 * [http://openbook.rheinwerk-verlag.de/linux/linux_kap05_003.html#dodtp0276bdb0-9576-4677-a72e-2fafe62817f5 Prozesse, Tasks und Threads] {de} - "Linux. Das umfassende Handbuch", von Johannes Ploetner und Steffen Wendzel, Rheinwerk * [wikipedia:Signal_%28Computer%29:Gängige UNIX-Signale] # tag: Shell, System, PID, Prozesse