A maioria das descrições de SIGTERM e SIGKILL apontam que SIGKILL,
Em contraste com SIGTERM e SIGINT, [...] não pode ser capturado ou ignorado [...] (Wikipédia)
Esta é a única diferença entre SIGTERM e SIGKILL? Em particular, se um processo não instala um manipulador SIGTERM, existe alguma diferença entre enviar SIGTERM ou SIGKILL para o processo?
Responder1
Na ausência de qualquer configuração de sinal, SIGTERM
e SIGKILL
são na prática equivalentes, pelo menos do ponto de vista do processo eliminado, assim como os outros sinais cuja ação padrão é encerrar um processo, incluindo SIGUSR1
e SIGUSR2
. Comoilkkachuaponta, o processo pai é informado do sinal que encerrou o processo filho (que é como seu shell pode distinguir entre os sinais e imprimirpor exemplo“terminado” v. “sinal 1 definido pelo usuário”).
Conforme mencionado na Wikipedia, SIGKILL
não pode ser capturado ou ignorado, mas SIGTERM
pode; observe que isso significa que um processo não precisa instalar um manipulador para SIGTERM
ser ineficaz, ele pode simplesmente bloqueá-lo ou ignorá-lo (vejasighold()
, sigrelse()
esigignore()
).
POSIX como uma seção detalhada sobre ojustificativa por trás do tratamento de sinal. O Linuxsignal(7)
os documentos da página de manual também sinalizam em detalhes.
Responder2
Esta é a única diferença entre SIGTERM e SIGKILL?
Não.
Uma grande diferença entre a SIGKILL
e um não capturado SIGTERM
é que o primeiro tambémacordarum processo parado (para que possa se destruir imediatamente), enquanto o último só terá efeito após um SIGCONT
.
Exemplo simples:
$ sleep 1000 & sleep 1; kill -TSTP $!
[1] 6455
[1]+ Stopped sleep 1000
$ kill -TERM 6455
$ jobs
[1]+ Stopped sleep 1000
$ kill -CONT 6455
$ jobs
[1]+ Terminated sleep 1000
Se você quiser ter certeza de que seu sinal TERM
, HUP
, INT
, etc. tem algum efeito, você deve emparelhá-lo com um CONT
sinal (em qualquer ordem).
As pessoas podem não entender isso facilmente por causa da magia interna do bash kill
- quando usado com um ID de trabalho como %
ou %1
(ou com um pid negado) referindo-se a um paradotrabalho, ele vaifaça tudo isso sozinhoatrás das cortinas:
/* Give PID SIGNAL. This determines what job the pid belongs to (if any).
If PID does belong to a job, and the job is stopped, then CONTinue the
job after giving it SIGNAL. Returns -1 on failure. If GROUP is non-null,
then kill the process group associated with PID. */
int
kill_pid (pid, sig, group)