Dans le man page
, il est écrit:
kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
pid... Specify the list of processes that kill should signal. Each pid can be one of five things:
0 All processes in the current process group are signaled
Et j'ai essayé comme ça en bash:
$ man kill &
[1] 15247
$
[1]+ Stopped man kill
$ kill 0
$ ps
15247 pts/41 00:00:00 man
Ici 0
est utilisé comme pid
. Si je comprends bien, kill 0
va tuer tous les processus dans le processus actuel, qui comprend pid15247
. Cependant, il n'a rien fait dans cet exemple. Quelqu'un at-il des idées sur la façon de l'utiliser?
process
kill
process-groups
Arme à feu
la source
la source
SIGTERM
au processus, ce qu'il a fait. Laman
commande a choisi de l'ignorer.ps -j
pour voir les groupes de processus.kill -0
(note le tableau de bord), ce qui est un autre sujet, à StackOverflow et ici sur Unix.SE .Réponses:
Comme il est dit, il envoie le signal à tous les membres du groupe de processus de l'appelant.
Les groupes de processus sont utilisés pour implémenter le contrôle des travaux dans le shell (ils peuvent être utilisés pour d'autres choses, mais le contrôle interactif des travaux du shell est la principale raison de leur existence).
Vous remarquerez que lorsque vous tapez Ctrl-C, tous les processus des travaux en cours sont tués, pas seulement celui qui les a démarrés. De plus, cela ne tue pas les tâches d'arrière-plan.
Cela est réalisé avec des groupes de processus. Un travail est un groupe de processus démarré par un shell que le shell peut mettre en arrière-plan ou au premier plan (défini comme groupe de processus de premier plan du terminal ou non) et tuer dans son ensemble.
Vous pouvez en savoir plus sur les identifiants de groupe de processus et les identifiants de session avec
ps -j
(j
pour le Jcontrôle ob).Pour tuer le groupe de processus de PGID
$x
, vous effectuez:kill 0
tue le groupe de processus de l'appelant.Notez que si vous faites
/bin/kill 0
:, le shell lancera un nouveau travail pour exécuter cettekill
commande, donckill
ne se tuera que lui-même.kill
est généralement un shell intégré, donckill
tuera le groupe de processus du shell.Cependant, lorsque le shell est interactif, c'est le processus qui gère les groupes de processus, donc généralement il n'y a pas d'autre processus dans le groupe de processus du shell. Tous les processus démarrés par le shell, se trouvent dans d'autres groupes de processus:
Ci-dessus,
sleep
etps
sont dans deux groupes de processus différents, un en arrière-plan, un en premier plan et ils sont différents du groupe de processus du shell.Vous pourriez cependant faire:
Le shell interactif démarrerait un nouveau groupe de processus pour ce sous-shell, et le sous-shell et man (et les autres commandes démarrées par man comme votre pager, groff ...) seraient dans le même groupe de processus, donc
kill 0
y travailleraient. (ce quisleep
précède est de donner suffisamment de temps pour que le pager démarre afin que nous puissions le voir dans laps -j
sortie avant de le tuer).la source
kill -- -$x
ditbash: kill: (-63531) - No such process
en fait dans bash 5.0.11 (1) -release sur MacOS 10.14 mais il est sûr que le processus existe et fonctionne.pkill -P
fonctionne bienps -j
pour en savoir plus sur les pgids