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:
para que eso kill 0
no mate a un shell interactivo
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 posteriores set +m
) no crearon grupos de procesos para los comandos de fondo. Por lo tanto, puede usar el comando kill 0
para eliminar todos los comandos en segundo plano sin cerrar la sesión. Por lo tanto, la kill 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 ejecutar pkill -t $TTY
o pkill -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
o logout
), 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 usarlo kill -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 luego kill -123 -456 …
elimine los grupos de proceso.
/bin/kill
o la cáscara incorporada? Si es lo último, supongo que el caparazón no se suicidará con su propio incorporado.