Pourquoi le PGID de mon enfant ne traite-t-il pas le PID du parent?

13

Je continue donc de lire partout que cette commande devrait mettre fin à tous les processus enfants du processus parent:

kill -- -$$

L'utilisation d'un ID négatif avec la commande kill fait référence à un PGID et d'après les exemples que j'ai vus, il semble que le PGID des processus enfants devrait être le PID du parent, mais ce n'est pas le cas sur mon système.

Sur mon système, le PGID de l'enfant est le même que le PGID du script parent qui se révèle être bash.

Que se passe t-il ici? Les exemples étaient-ils erronés ou mon système est-il configuré différemment?

Ce que je dois réaliser est de mettre fin aux processus enfants sans terminer le parent, donc je ne veux pas envoyer de signal d'arrêt au PGID dans lequel se trouve le parent.

TCZ8
la source

Réponses:

11

Je pense que vous voulez dire PGID, qui signifie Process Group ID .

Lorsqu'un processus est bifurqué, il hérite son PGID de son parent. Le PGID change lorsqu'un processus devient un chef de groupe de processus , puis son PGID est copié à partir de son PID. À partir de ce moment-là, le nouvel enfant qu'il génère, et leurs descendants, héritent de ce PGID (à moins qu'ils ne commencent leur propre groupe de processus).

Dans un shell avec contrôle des travaux, comme la plupart des shells interactifs, chaque travail est placé dans son propre groupe de processus. Si vous exécutez un script shell, le processus shell exécutant le script sera le chef de groupe et le PGID sera égal à son PID.

Dans un shell sans contrôle de tâche, comme la plupart des shells utilisés pour exécuter des scripts, les commandes sont exécutées dans le groupe de processus du shell.

La syntaxe kill -- -Ntue tous les processus du groupe avec PGID = N. Vous ne pouvez pas l'utiliser avec un PID arbitraire, uniquement le PID d'un leader de groupe de processus, puisque c'est le PGID. C'est essentiellement ainsi que

kill %jobid

la syntaxe fonctionne - elle se traduit en interne par %jobidle PGID du travail et envoie le signal à ce PGID.

Il n'y a pas de moyen simple d'exécuter un script dans son propre groupe de processus à partir d'un autre script shell. Voir Comment définir le groupe de processus d'un script shell pour quelques suggestions, cependant.

Barmar
la source
Êtes-vous en train de dire qu'un shell avec ou sans contrôle des tâches fait la même chose?
TCZ8
1
Non. Un shell avec contrôle des travaux démarre un nouveau groupe de processus pour chaque travail. Un shell sans contrôle de travail ne démarre pas un nouveau groupe de processus pour chaque travail, il les exécute dans son propre groupe de processus.
Barmar
wow .. Je n'ai pas bien lu la première fois. Donc je suppose que ce que je veux, c'est activer le contrôle des tâches? Cela garantirait-il que les enfants ont un PGID correspondant au PID du script parent? Ou chaque enfant recevra-t-il son propre PGID unique?
TCZ8
J'ai trouvé des documents en ligne sur les contrôleurs de tâches, je ne vais pas passer par là. Merci pour votre aide Barmar.
TCZ8
1
Avec le contrôle du travail, chaque enfant obtient son propre PGID. Sans contrôle des tâches, ils héritent du PGID du parent. Mais le parent peut avoir hérité son PGID de son parent, s'il ne s'agit pas d'un chef de groupe de processus.
Barmar