Parfois, lorsque je veux me déconnecter rapidement, je le fais kill -15 -1
. J'ai remarqué que bash ignore SIGTERM.
Je me demande quelle est la justification d'un tel comportement bash ?
Ce n'est pas très UNIX d'ignorer SIGTERM sans une bonne raison, n'est-ce pas?
MISE À JOUR:
même (aucun) effet pour tous:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
MISE À JOUR2:
De l' homme bash :
Lorsque bash est interactif, en l'absence de tout piège, il ignore SIGTERM
C'est donc fait exprès. Mais pourquoi?
/bin/kill
ou le shell intégré? Si ce dernier, je suppose que le shell ne se tuera pas avec son propre intégré.Réponses:
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:
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èsset +m
) n'ont pas créé de groupes de processus pour les commandes d'arrière-plan. Vous pouvez donc utiliser la commandekill 0
pour supprimer toutes les commandes d'arrière-plan sans vous déconnecter.² Ainsi, lakill 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écuterpkill -t $TTY
oupkill -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
oulogout
), 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 utiliserkill -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, puiskill -123 -456 …
pour tuer les groupes de processus.la source
Cela pourrait répondre à votre question:
SOURCE : Le manuel GNU Bash
la source