Tout d'abord, ce n'est pas spécifique à bash. ATT ksh, dash et zsh se comportent de la même manière: ils ignorent SIGTERM et SIGQUIT lors de l'édition en ligne de commande; quant à mksh, il ne quitte pas non plus mais les traite comme SIGINT.
Le manuel ksh et le manuel bash justifient d'ignorer SIGTERM en ces termes:
ce qui kill 0
ne tue pas un shell interactif
kill 0
tue tous les processus du groupe de processus dans lequel se trouve la coque¹. En résumé, le groupe de processus se compose de tous les processus en cours d'exécution au premier plan sur un terminal, ou de tous les processus en tâche de fond ou suspendus.
Plus précisément, c'est ce qui se passe dans les coques modernes avec contrôle des tâches . Dans de tels shells, kill 0
ne serait pas utile, car le shell serait dans un groupe de processus qui lui est propre. Les shells plus anciens (ou les shells modernes après set +m
) n'ont pas créé de groupes de processus pour les commandes d'arrière-plan. Vous pouvez donc utiliser la commande kill 0
pour supprimer toutes les commandes d'arrière-plan sans vous déconnecter.² Ainsi, la kill 0
logique ressemble à une ancienne qui n'est plus justifiée de nos jours mais conservée pour une compatibilité descendante.
Cependant, il existe d'autres situations similaires où l'immunisation de la coquille est utile. Considérez le cas où vous avez des processus monopolisant un terminal et que vous souhaitez les tuer sans vous déconnecter. De nombreux systèmes ont un outil comme celui pkill
qui vous permet de tuer les processus en cours d'exécution sur un terminal. Vous pouvez exécuter pkill -t $TTY
ou pkill -QUIT -t $TTY
tuer tous les processus en cours d'exécution sur le terminal actuel, à l'exception du shell qui ignore le signal.
Un shell disparaît normalement soit lorsque l'utilisateur le quitte (avec une commande comme exit
ou logout
), soit lorsque son terminal signale la fin de l'entrée (l'utilisateur peut provoquer cela en appuyant sur Ctrl+ D) ou disparaît complètement. Dans ce dernier cas, le shell reçoit le signal SIGHUP, et il ne l'ignore pas.
Pour votre cas d'utilisation de déconnexion d'une session X, le kill -15 -1
fera, car il tue l'émulateur de terminal qui fait que le shell reçoit SIGHUP. Il suffit en fait de tuer le serveur X, mais cela nécessite de trouver son ID de processus. Si vous souhaitez que la même commande fonctionne sur une session de texte, vous pouvez utiliser kill -15 -1; exit
. C'est une commande assez dangereuse à avoir à portée de main de toute façon.
¹ Cela ne semble pas être mentionné en règle générale dans les manuels du shell; c'est une caractéristique de l'appel système sous-jacent. Il est mentionné explicitement dans la spécification POSIX .
² De nos jours, pour ce faire, exécutez jobs -l
pour voir une liste des travaux avec leur ID de groupe de processus, puis kill -123 -456 …
pour tuer les groupes de processus.
/bin/kill
ou le shell intégré? Si ce dernier, je suppose que le shell ne se tuera pas avec son propre intégré.