SIGSTOP
и SIGKILL
два сигнала, которые не могут быть пойманы и обработаны процессом. SIGTSTP
это как SIGSTOP
за исключением того, что он может быть пойман и обработан.
SIGSTOP
И SIGTSTP
сигналы остановки процесса в своих направлениях, готовы к SIGCONT
. Когда вы отправляете этот процесс a SIGTERM
, процесс не выполняется и поэтому не может запустить код для выхода.
(Существуют также SIGTTIN
и SIGTTOU
, которые являются сигналами, генерируемыми уровнем TTY, когда фоновое задание пытается прочитать или записать в терминал. Они могут быть перехвачены, но в противном случае остановят (приостановят) процесс, точно так же SIGTSTP
. Но я сейчас иду игнорировать эти два до конца этого ответа.)
Вы CtrlZотправляете процесс a SIGTSTP
, который, похоже, не обрабатывается каким-либо образом rsyslogd
, поэтому он просто приостанавливает процесс в ожидании SIGCONT
или SIGKILL
.
Решение здесь также состоит в том, чтобы отправить SIGCONT
за вами, SIGTERM
чтобы процесс мог получать и обрабатывать сигнал.
Пример:
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
Я думаю, что документация для библиотеки GNU C объясняет это довольно хорошо (мое выделение):
Пока процесс остановлен, никакие сигналы не могут быть доставлены до его продолжения , кроме SIGKILL
сигналов и (очевидно) SIGCONT
сигналов. Сигналы помечаются как ожидающие, но не доставляются, пока процесс не будет продолжен. Сигнал всегда вызывает прекращение процесса и не может быть заблокирован, обрабатывается или игнорируется. Вы можете игнорировать , но это всегда приводит к продолжению процесса, если он остановлен. Отправка сигнала процессу вызывает сброс всех ожидающих сигналов остановки для этого процесса. Аналогично, любые ожидающие сигналы для процесса отбрасываются, когда он получает сигнал остановкиSIGKILL
SIGCONT
SIGCONT
SIGCONT
kill -15
вы уже отправили».