Que fait kill 0 en fait? [fermé]

22

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 0est utilisé comme pid. Si je comprends bien, kill 0va 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?

Arme à feu
la source
Il envoie un SIGTERMau processus, ce qu'il a fait. La mancommande a choisi de l'ignorer.
jordanm
5
@jordanm, non. un travail démarré par un shell interactif a un groupe de processus différent de celui du shell. C'est ainsi que le shell peut le mettre en avant-plan et en arrière-plan. Voir ps -jpour voir les groupes de processus.
Stéphane Chazelas
1
Cette question est en fait une copie de la question SuperUser Que fait réellement kill 0? (qui a été migré depuis StackOverflow). Voir aussi des questions sur kill -0(note le tableau de bord), ce qui est un autre sujet, à StackOverflow et ici sur Unix.SE .
Adam Katz

Réponses:

27

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( jpour le Jcontrôle ob).

Pour tuer le groupe de processus de PGID $x, vous effectuez:

kill -- "-$x"

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 cette killcommande, donc killne se tuera que lui-même.

killest généralement un shell intégré, donc killtuera 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:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Ci-dessus, sleepet pssont 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:

(man kill & sleep 1; ps -j; kill 0)

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 0y travailleraient. (ce qui sleepprécède est de donner suffisamment de temps pour que le pager démarre afin que nous puissions le voir dans la ps -jsortie avant de le tuer).

Stéphane Chazelas
la source
kill -- -$xdit bash: kill: (-63531) - No such processen fait dans bash 5.0.11 (1) -release sur MacOS 10.14 mais il est sûr que le processus existe et fonctionne. pkill -Pfonctionne bien
kyb
1
@kyb $ x doit être un identifiant de groupe de processus et non un identifiant de processus. Voir la sortie de ps -jpour en savoir plus sur les pgids
Stéphane Chazelas