Notice: Undefined index: string in /var/www/stefan/howtux.de/htdocs/article.php on line 49

Notice: Undefined index: settings in /var/www/stefan/howtux.de/htdocs/article.php on line 61
Home / Prozesse und IPC / Signale

Signale

Kategorie: Prozesse und IPCErstellt: 02.10.2007 - 23:58 Geändert: 23.10.2007 - 23:18
Autor: Stefan Abu Salah
0Signale sind, vereinfacht dargestellt, Kurznachrichten an Prozesse. Diese Nachrichten sollen im Normalfall den empfangenen Prozess dazu bewegen eine gewisse Aktion auszuführen (z.B. Beenden, Konfiguration neu einlesen, etc.). Ein wichtiges Programm für das benutzergesteuerte Versenden von Signalen ist kill. kill erwartet als Übergabe mindestens eine Prozess-ID. An den dazu gehörigen Prozess wird das angegebene Signal gesendet. Wird kein Signal angegeben, so sendet kill immer SIGTERM. Dies führt jedoch nicht zwangsläufig zum Beenden des Prozesses, da dieses Signal abgefangen werden könnte. Möchte man einen Prozess sicher beenden sollte man ihm das Signal SIGKILL, welches ununterbrechbar ist, senden.

Eine vollständige Liste der von kill unterstützten Signale bekommen Sie durch den Aufruf von kill -l.


Gängige Signalnummern:

SIGHUP 1 /* Hangup (POSIX). */
SIGINT 2 /* Interrupt (ANSI). */
SIGQUIT 3 /* Quit (POSIX). */
SIGILL 4 /* Illegal instruction (ANSI). */
SIGTRAP 5 /* Trace trap (POSIX). */
SIGABRT 6 /* Abort (ANSI). */
SIGIOT 6 /* IOT trap (4.2 BSD). */
SIGBUS 7 /* BUS error (4.2 BSD). */
SIGFPE 8 /* Floating-point exception (ANSI). */
SIGKILL 9 /* Kill, unblockable (POSIX). */
SIGUSR1 10 /* User-defined signal 1 (POSIX). */
SIGSEGV 11 /* Segmentation violation (ANSI). */
SIGUSR2 12 /* User-defined signal 2 (POSIX). */
SIGPIPE 13 /* Broken pipe (POSIX). */
SIGALRM 14 /* Alarm clock (POSIX). */
SIGTERM 15 /* Termination (ANSI). */
SIGSTKFLT 16 /* Stack fault. */
SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
SIGCHLD 17 /* Child status has changed (POSIX). */
SIGCONT 18 /* Continue (POSIX). */
SIGSTOP 19 /* Stop, unblockable (POSIX). */
SIGTSTP 20 /* Keyboard stop (POSIX). */
SIGTTIN 21 /* Background read from tty (POSIX). */
SIGTTOU 22 /* Background write to tty (POSIX). */
SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
SIGPOLL SIGIO /* Pollable event occurred (System V). */
SIGIO 29 /* I/O now possible (4.2 BSD). */
SIGPWR 30 /* Power failure restart (System V). */
SIGSYS 31 /* Bad system call. */
SIGUNUSED 31

Beispiel: kill


stefan@troubadix/home/stefan$ sleep 60 &
[1] 18062

stefan@troubadix/home/stefan$ ps
PID TTY TIME CMD
5298 pts/1 00:00:00 bash
18062 pts/1 00:00:00 sleep
18093 pts/1 00:00:00 ps

stefan@troubadix/home/stefan$ kill 18062
[1]+ Terminated sleep 60

stefan@troubadix/home/stefan$ ps
PID TTY TIME CMD
5298 pts/1 00:00:00 bash
18217 pts/1 00:00:00 ps

Möchte man sich sicher sein das ein Prozess beendet wird sollte man das Signal SIGKILL (9) verwenden


Beispiel: Senden eines anderen Signals mittels kill


stefan@troubadix/home/stefan$ sleep 60 &
[1] 18062

stefan@troubadix/home/stefan$ kill -s 19 18062

stefan@troubadix/home/stefan$ ps
PID TTY TIME CMD
5298 pts/1 00:00:00 bash
18062 pts/1 00:00:00 sleep
18093 pts/1 00:00:00 ps

# Nach >60 Sekunden ...
stefan@troubadix/home/stefan$ ps
PID TTY TIME CMD
5298 pts/1 00:00:00 bash
18062 pts/1 00:00:00 sleep
18093 pts/1 00:00:00 ps

stefan@troubadix/home/stefan$ kill -s 18 18062
stefan@troubadix/home/stefan$
[1] Done sleep 60

Unterbrechbare und nicht unterbrechbare Signale


Es gibt zwei Gruppen von Signalen. Die unterbrechbaren und die nicht unterbrechbaren. Der Adressat der nicht unterbrechbaren Signale ist immer der Kernel. Dieser zwingt dann den jeweiligen Prozess dazu die gewünschte Aktion auszuführen. Unterbrechbare Signale werden direkt an den Empfänger gesendet. Ob dieser das Signal befolgt oder nicht hängt einzig von dem Empfänger ab.

Rechte


Nicht jeder Benutzer darf jedem Prozess beliebige Signale schicken. Generell muss die dem Prozess zugeordnete User-ID mit der des Prozesses übereinstimmen, damit eine Aktion erlaubt ist. Eine Ausnahme stellt auch hier der Benutzer root dar. Dieser darf an jeden beliebigen Prozess beliebige Signale senden.

Jeder Benutzer darf nur seinen eigenen Prozessen Signale schicken.


Optionen:
-l - Liste der verfügbaren Signale ausgeben.
-p - Gibt nur die Prozess-ID aus, sendet keine Signale
-s SIGNALNUMMER - Anstelle von SIGTERM wird das angegebene Signal gesendet


killall


Der größte Unterschied zwischen kill und killall ist der, dass man killall den Namen des Prozesses übergeben kann und sich somit nicht zuerst die Prozess-ID heraussuchen muss. Wenn mehere Prozesse mit dem gleichen Namen existieren, werden alle diese Prozesse beendet. Auch killall kann man die Art des Signals übergeben.

Optionen: killall
-q - Unterdrückt die Warnung, wenn keinen Prozessen Signale übermittelt werden konnten.
-l - Liste der verfügbaren Signale ausgeben
-w - killall wartet, bis alle spezifizierten Prozesse aufgehört haben zu existieren



stefan@london:~$ sleep 60 &
[1] 20059
stefan@london:~$ sleep 60 &
[2] 20062
stefan@london:~$ sleep 60 &
[3] 20065
stefan@london:~$ ps
PID TTY TIME CMD
5298 pts/1 00:00:00 bash
20059 pts/1 00:00:00 sleep
20062 pts/1 00:00:00 sleep
20065 pts/1 00:00:00 sleep
20078 pts/1 00:00:00 ps
stefan@london:~$ killall sleep
[1] Terminated sleep 60
[2]- Terminated sleep 60
[3]+ Terminated sleep 60
stefan@london:~$ ps
PID TTY TIME CMD
5298 pts/1 00:00:00 bash
20098 pts/1 00:00:00 ps
stefan@london:~$


Notice: Undefined variable: urli in /var/www/stefan/howtux.de/htdocs/classes.php on line 240
Bookmark auf del.icio.usBookmark auf Mister WongBookmark auf BlinklistBookmark auf GoogleBookmark auf LinkarenaBookmark auf YiggBookmark auf FolkdBookmark auf Yahoo
Home / Prozesse und IPC / Signale
simplum