SIGSTOP
e SIGKILL
são dois sinais que não podem ser capturados e manipulados por um processo. SIGTSTP
é como SIGSTOP
, exceto que pode ser capturado e manipulado.
Os sinais SIGSTOP
e SIGTSTP
interrompem um processo, pronto para SIGCONT
. Quando você envia esse processo a SIGTERM
, o processo não está em execução e, portanto, não pode executar o código para sair.
(Há também SIGTTIN
e SIGTTOU
, que são sinais gerados pela camada TTY quando uma tarefa em segundo plano tenta ler ou gravar no terminal. Eles podem ser capturados, mas irão parar (suspender) o processo, apenas como SIGTSTP
. Mas agora vou ignorar esses dois para o restante desta resposta.)
A sua Ctrl Z envia ao processo um SIGTSTP
, que parece não ser tratado de maneira especial por rsyslogd
, então simplesmente suspende o processo pendente SIGCONT
ou SIGKILL
.
A solução aqui também é enviar SIGCONT
após seu SIGTERM
para que o processo possa receber e manipular o sinal.
Exemplo:
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
A documentação para a Biblioteca GNU C explica isso muito bem , Eu acho (meu destaque):
While a process is stopped, no more signals can be delivered to it until it is continued, except
SIGKILL
signals and (obviously)SIGCONT
signals. The signals are marked as pending, but not delivered until the process is continued. TheSIGKILL
signal always causes termination of the process and can’t be blocked, handled or ignored. You can ignoreSIGCONT
, but it always causes the process to be continued anyway if it is stopped. Sending aSIGCONT
signal to a process causes any pending stop signals for that process to be discarded. Likewise, any pendingSIGCONT
signals for a process are discarded when it receives a stop signal