SIGSTOP
e SIGKILL
são dois sinais que não podem ser capturados e manipulados por um processo. SIGTSTP
é como, SIGSTOP
exceto que ele pode ser capturado e manuseado.
Os sinais SIGSTOP
e SIGTSTP
param um processo em suas trilhas, 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.
(Também existem SIGTTIN
e SIGTTOU
, que são sinais gerados pela camada TTY quando um trabalho em segundo plano tenta ler ou gravar no terminal. Eles podem ser capturados, mas, de outra forma, interromperão (suspenderão) o processo, assim como SIGTSTP
. Mas agora vou para ignorar esses dois pelo restante desta resposta.)
Você CtrlZenvia o processo a SIGTSTP
, que parece não ter sido tratado de maneira alguma por rsyslogd
isso, simplesmente suspende o processo pendente SIGCONT
ou SIGKILL
.
A solução aqui também é enviar SIGCONT
após o 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 da GNU C Library explica isso muito bem, eu acho (meu destaque):
Enquanto um processo é interrompido, nenhum outro sinal pode ser enviado até que continue , exceto SIGKILL
sinais e (obviamente) SIGCONT
sinais. Os sinais são marcados como pendentes, mas não são entregues até que o processo continue. O SIGKILL
sinal sempre causa o término do processo e não pode ser bloqueado, manipulado ou ignorado. Você pode ignorar SIGCONT
, mas sempre faz com que o processo continue mesmo assim, se estiver parado. Enviar um SIGCONT
sinal para um processo faz com que quaisquer sinais de parada pendentes para esse processo sejam descartados. Da mesma forma, quaisquer SIGCONT
sinais pendentes para um processo são descartados quando ele recebe um sinal de parada
kill -15
você já havia enviado".