Innanzitutto, questo non è specifico per bash. ATT ksh, dash e zsh si comportano allo stesso modo: ignorano SIGTERM e SIGQUIT durante l'edizione da riga di comando; per quanto riguarda mksh, anche non si chiude ma li tratta come SIGINT.
Sia il manuale di ksh che il manuale di bash giustificano l'ignoranza di SIGTERM in questi termini:
in modo che kill 0
non uccida una shell interattiva
kill 0
uccide tutti i processi nel gruppo di processi in cui si trova la shell¹. In poche parole, il gruppo di processi è costituito da tutti i processi in esecuzione in primo piano su un terminale o da tutti i processi in background o in sospeso.
Più precisamente, questo è ciò che accade nelle shell moderne con controllo del lavoro . In tali shell, kill 0
non sarebbe utile, poiché la shell sarebbe in un gruppo di processo a sé stante. Le shell più vecchie (o le shell moderne dopo set +m
) non hanno creato gruppi di processi per i comandi in background. Quindi è possibile utilizzare il comando kill 0
per eliminare tutti i comandi in background senza disconnettersi.² Pertanto la kill 0
logica appare come una vecchia che al giorno d'oggi non è più giustificata ma mantenuta per compatibilità con le versioni precedenti.
Tuttavia ci sono altre situazioni simili in cui è utile rendere immune il guscio. Considera il caso in cui hai processi che registrano un terminale e vuoi ucciderli senza essere disconnesso. Molti sistemi hanno uno strumento come quello pkill
che ti consente di uccidere i processi in esecuzione su un terminale. È possibile eseguire pkill -t $TTY
o pkill -QUIT -t $TTY
uccidere tutti i processi in esecuzione sul terminale corrente, tranne la shell che ignora il segnale.
Una shell normalmente scompare quando l'utente esce (con un comando simile a exit
o logout
) o quando il suo terminale segnala la fine dell'input (l'utente può causare ciò premendo Ctrl+ D) o scompare del tutto. In quest'ultimo caso, la shell riceve il segnale SIGHUP e non lo ignora.
Per il tuo caso d'uso di disconnettersi da una sessione X, kill -15 -1
lo farà, poiché uccide l'emulatore di terminale che fa sì che la shell riceva SIGHUP. È infatti sufficiente uccidere il server X, ma ciò richiede la ricerca dell'ID del processo. Se si desidera che lo stesso comando funzioni su una sessione di testo, è possibile utilizzare kill -15 -1; exit
. È comunque un comando abbastanza pericoloso da avere a portata di mano.
¹ Questo non sembra essere menzionato nei manuali di shell come regola; è una caratteristica della chiamata di sistema sottostante. È menzionato esplicitamente nella specifica POSIX .
² Al giorno d'oggi, per farlo, eseguire jobs -l
per visualizzare un elenco di lavori con l'ID del gruppo di processi, quindi kill -123 -456 …
per terminare i gruppi di processi.
/bin/kill
o la shell integrata? In quest'ultimo caso, suppongo che la shell non si ucciderà da sola.