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
SIGKILLsignals and (obviously)SIGCONTsignals. The signals are marked as pending, but not delivered until the process is continued. TheSIGKILLsignal 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 aSIGCONTsignal to a process causes any pending stop signals for that process to be discarded. Likewise, any pendingSIGCONTsignals for a process are discarded when it receives a stop signal