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
вы уже отправили».SIGKILL
предотвращает очистку приложения, поэтому использованиеSIGTERM
предпочтительнее во многих (большинстве) случаях.SIGTERM
точно так же, как любой другой сигнал в том, что он может быть пойман процессом. Получение сигнала просто заставит процесс перейти к специальной процедуре обработки сигнала. ДляSIGTERM
действия по умолчанию будет завершить процесс, но , например , редактор мог бы поймать сигнал , чтобы он мог сохранить черновик всех открытых файлов перед смертью. Если процесс остановлен, он не может запустить обработчик сигнала, но сигнал останется в ожидании, пока процесс не продолжится. Обратите внимание, что количество отправленных сигналов обычно не сохраняется.Теоретически, система может знать, установлен ли для процесса обработчик сигнала
SIGTERM
, и немедленно прекратить его, если нет. Но (согласно комментарию Жиля) POSIX требует, чтобы сигнал ожидался до тех пор, пока процесс не будет продолженSIGCONT
.источник