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сигналов. Сигналы помечаются как ожидающие, но не доставляются, пока процесс не будет продолжен. Сигнал всегда вызывает прекращение процесса и не может быть заблокирован, обрабатывается или игнорируется. Вы можете игнорировать , но это всегда приводит к продолжению процесса, если он остановлен. Отправка сигнала процессу вызывает сброс всех ожидающих сигналов остановки для этого процесса. Аналогично, любые ожидающие сигналы для процесса отбрасываются, когда он получает сигнал остановкиSIGKILLSIGCONTSIGCONTSIGCONT
kill -15вы уже отправили».