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вже відправлене".