SIGSTOP
und SIGKILL
sind zwei Signale, die von einem Prozess nicht erfasst und verarbeitet werden können. SIGTSTP
ist wie die SIGSTOP
Ausnahme , dass es kann abgefangen und behandelt werden.
Die Signale SIGSTOP
und SIGTSTP
stoppen einen Prozess in seinen Spuren, bereit für SIGCONT
. Wenn Sie diesen Prozess a senden, wird SIGTERM
der Prozess nicht ausgeführt, und der Code zum Beenden kann nicht ausgeführt werden.
(Es gibt auch SIGTTIN
und SIGTTOU
- Signale, die von der TTY-Ebene generiert werden, wenn ein Hintergrundjob versucht, Daten auf dem Terminal zu lesen oder zu schreiben. Sie können abgefangen werden, halten den Prozess aber ansonsten an (unterbrechen), genau wie SIGTSTP
. Aber ich gehe jetzt um diese beiden für den Rest dieser Antwort zu ignorieren.)
Ihr CtrlZsendet den Prozess a SIGTSTP
, der anscheinend in keiner Weise speziell von behandelt wird rsyslogd
, so dass er einfach den Prozess pendent SIGCONT
oder aussetzt SIGKILL
.
Die Lösung besteht hier auch darin, SIGCONT
nach Ihrem zu senden, SIGTERM
damit der Prozess das Signal empfangen und verarbeiten kann.
Beispiel:
sleep 999 &
# Assume we got PID 456 for this process
kill -TSTP 456 # Suspend the process (nicely)
kill -TERM 456 # Terminate the process (nicely). Nothing happens
kill -CONT 456 # Continue the process so it can exit cleanly
Die Dokumentation für die GNU C Library erklärt dies ziemlich gut, denke ich (meine Hervorhebung):
Während ein Prozess gestoppt ist, können keine Signale mehr an ihn gesendet werden, bis er fortgesetzt wird , mit Ausnahme von SIGKILL
Signalen und (offensichtlich) SIGCONT
Signalen. Die Signale werden als anstehend markiert, aber erst dann zugestellt, wenn der Vorgang fortgesetzt wird. Das SIGKILL
Signal führt immer zum Abbruch des Prozesses und kann nicht blockiert, verarbeitet oder ignoriert werden. Sie können ignorieren SIGCONT
, aber es führt immer dazu, dass der Prozess trotzdem fortgesetzt wird, wenn er gestoppt wird. Wenn Sie ein SIGCONT
Signal an einen Prozess senden, werden alle anstehenden Stoppsignale für diesen Prozess verworfen. Ebenso werden alle anstehenden SIGCONT
Signale für einen Prozess verworfen, wenn er ein Stoppsignal empfängt
kill -15
bereits gesendeten Daten verarbeitet".SIGKILL
Verhindert, dass eine App bereinigt wird. DaherSIGTERM
ist die Verwendung in vielen (den meisten) Fällen vorzuziehen.SIGTERM
ist wie jedes andere Signal darin, dass es von einem Prozess abgefangen werden kann. Durch den Empfang des Signals springt der Prozess zu einer speziellen Signalbehandlungsroutine. FürSIGTERM
die Standard - Aktion den Prozess beenden wird, sondern zB könnte ein Editor wie das Signal zu fangen , so dass es einen Entwurf Kopie aller geöffneten Dateien , bevor sie sterben zu speichern. Wenn der Prozess gestoppt wird, kann der Signalhandler nicht ausgeführt werden, das Signal bleibt jedoch anstehend, bis der Prozess fortgesetzt wird. Beachten Sie, dass die Anzahl der gesendeten Signale normalerweise nicht gespeichert wird.Theoretisch könnte das System wissen, ob für den Prozess ein Signal-Handler installiert ist
SIGTERM
, und ihn, falls nicht, sofort beenden. Nach Gilles 'Kommentar verlangt POSIX jedoch, dass das Signal anhält, bis der Prozess über fortgesetzt wirdSIGCONT
.quelle