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