La mayoría de las descripciones de SIGTERM y SIGKILL señalan que SIGKILL,
A diferencia de SIGTERM y SIGINT, [...] no se puede detectar ni ignorar [...] (Wikipedia)
¿Es esta la única diferencia entre SIGTERM y SIGKILL? En particular, si un proceso no instala un controlador SIGTERM, ¿hay alguna diferencia entre enviar SIGTERM o SIGKILL al proceso?
Respuesta1
En ausencia de cualquier configuración de señal, SIGTERM
y SIGKILL
son en la práctica equivalentes, al menos desde la perspectiva del proceso finalizado, al igual que las otras señales cuya acción predeterminada es terminar un proceso, incluidas SIGUSR1
y SIGUSR2
. Comoilkkachuseñala, el proceso padre es informado de la señal que terminó el proceso hijo (que es como su shell puede distinguir entre las señales e imprimirp.ej“terminado” versus “señal 1 definida por el usuario”).
Como se menciona en Wikipedia, SIGKILL
no se puede detectar ni ignorar, mientras que SIGTERM
sí; tenga en cuenta que esto significa que un proceso no necesita instalar un controlador para SIGTERM
ser ineficaz, simplemente puede bloquearlo o ignorarlo (versighold()
, sigrelse()
ysigignore()
).
POSIX como una sección detallada sobre elRazón fundamental detrás del manejo de señales.. el linuxsignal(7)
La página de manual también documenta las señales en detalle.
Respuesta2
¿Es esta la única diferencia entre SIGTERM y SIGKILL?
No.
Una gran diferencia entre a SIGKILL
y no capturado SIGTERM
es que el primero tambiéndespertarun proceso detenido (por lo que podría destruirse inmediatamente), mientras que este último sólo tendrá efecto después de un archivo SIGCONT
.
Ejemplo sencillo:
$ 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
Si desea estar seguro de que su señal TERM
, HUP
, INT
, etc. tenga algún efecto, debe emparejarla con una CONT
señal (en cualquier orden).
Es posible que las personas no entiendan esto fácilmente debido a la magia de la kill
función incorporada de bash, cuando se usa con una identificación de trabajo como %
o %1
(o con un pid negado) que se refiere a una tarea detenida.trabajo, va ahacer todo eso por sí mismodetrás de las 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)