A veces, cuando quiero cerrar sesión rápidamente, lo hago kill -15 -1
. He notado que bash está ignorando a SIGTERM.
Me pregunto cuál es la razón de tal comportamiento bash .
No es muy UNIX ignorar SIGTERM sin una buena razón, ¿no?
ACTUALIZAR:
mismo (no) efecto para todos:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
ACTUALIZACIÓN2:
De man bash :
Cuando bash es interactivo, en ausencia de trampas, ignora SIGTERM
Entonces se hace a propósito. ¿Pero por qué?
/bin/kill
o la cáscara incorporada? Si es lo último, supongo que el caparazón no se suicidará con su propio incorporado.Respuestas:
Primero, esto no es específico de bash. ATT ksh, dash y zsh se comportan de la misma manera: ignoran SIGTERM y SIGQUIT durante la edición de la línea de comandos; En cuanto a mksh, tampoco se cierra pero los trata como SIGINT.
Tanto el manual de ksh como el manual de bash justifican ignorar SIGTERM en estos términos:
kill 0
mata todos los procesos en el grupo de procesos en el que está el shell¹. En pocas palabras, el grupo de procesos consta de todos los procesos que se ejecutan en primer plano en un terminal, o todos los procesos en segundo plano o trabajo suspendido.Más precisamente, esto es lo que sucede en los depósitos modernos con control de trabajo . En tales shells,
kill 0
no sería útil, ya que el shell estaría en un grupo de proceso propio. Los shells más antiguos (o los shells modernos posterioresset +m
) no crearon grupos de procesos para los comandos de fondo. Por lo tanto, puede usar el comandokill 0
para eliminar todos los comandos en segundo plano sin cerrar la sesión. Por lo tanto, lakill 0
lógica parece una vieja que ya no se justifica hoy en día, pero se mantiene por compatibilidad con versiones anteriores.Sin embargo, hay otras situaciones similares en las que es útil hacer que la cáscara sea inmune. Considere el caso en el que tiene procesos que acaparan una terminal y desea matarlos sin cerrar sesión. Muchos sistemas tienen una herramienta como la
pkill
que le permite eliminar los procesos que se ejecutan en un terminal. Puede ejecutarpkill -t $TTY
opkill -QUIT -t $TTY
eliminar todos los procesos que se ejecutan en el terminal actual, excepto el shell que ignora la señal.Un shell normalmente desaparece cuando el usuario sale (con un comando como
exit
ologout
), o cuando su terminal señala el final de la entrada (el usuario puede causar esto presionando Ctrl+ D) o desaparece por completo. En este último caso, el shell recibe la señal SIGHUP, y no ignora esa.Para su caso de uso de cerrar sesión en una sesión X,
kill -15 -1
lo hará, ya que mata el emulador de terminal que hace que el shell reciba SIGHUP. De hecho, es suficiente para matar el servidor X, pero eso requiere encontrar su ID de proceso. Si desea que el mismo comando funcione en una sesión de texto, puede usarlokill -15 -1; exit
. Es un comando bastante peligroso tener a tu alcance de todos modos.¹ Esto no parece ser mencionado en los manuales de shell como una regla; Es una característica de la llamada al sistema subyacente. Se menciona explícitamente en la especificación POSIX .
² Hoy en día, para hacer eso, ejecute
jobs -l
para ver una lista de trabajos con su ID de grupo de proceso y luegokill -123 -456 …
elimine los grupos de proceso.fuente
Esto podría responder a su pregunta:
FUENTE : El manual de GNU Bash
fuente