GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi le Pgid des processus enfants n'est-il pas le PID du parent ?

Je continue donc à lire partout que cette commande doit terminer 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 s'avère ê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 faire, c'est mettre fin aux processus enfants sans mettre fin au parent afin de ne pas envoyer de signal d'arrêt au PGID dans lequel se trouve le parent.

Réponse acceptée :

Lorsqu'un processus est forké, il hérite son PGID de son parent. Le PGID change lorsqu'un processus devient un chef de groupe de processus , son PGID est copié à partir de son PID. Dès lors, les nouveaux processus enfants qu'il génère et leurs descendants héritent de ce PGID (à moins qu'ils ne démarrent eux-mêmes de nouveaux groupes de processus).

Dans un shell avec contrôle des tâches, comme la plupart des shells interactifs, chaque tâche est placée 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 des tâches, 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 -- -N tue tous les processus du groupe avec PGID =N. Vous ne pouvez pas l'utiliser avec un PID arbitraire, uniquement le PID d'un chef de groupe de processus, car c'est le PGID. C'est essentiellement la façon dont le shell

kill %jobid

la syntaxe fonctionne — elle traduit en interne %jobid au 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.

Connexe :Déplacez tous les fichiers de plusieurs dossiers dans le répertoire parent avec l'invite de commande ?
Linux
  1. Construire des conteneurs à la main :l'espace de noms PID

  2. Pourquoi le CD n'est-il pas un programme ?

  3. Nouveau processus parent lorsque le processus parent meurt ?

  4. Pourquoi le mécanisme de création de processus par défaut est-il un fork ?

  5. Linux - Comment Node.js / Le module Cluster transmet-il les nouvelles connexions du processus maître / parent aux processus enfants?

Pourquoi ne pas installer des progiciels à partir d'Internet

Comment envoyer des processus en arrière-plan sous Linux

Le processus enfant reçoit le SIGINT du parent

Pourquoi le processus enfant est-il toujours en vie après la suppression du processus parent sous Linux?

Comment obtenir l'ID de processus pour tuer un processus nohup ?

Bash :Pourquoi le script parent ne se termine-t-il pas sur SIGINT lorsque le script enfant piège SIGINT ?