5 votes

Regrouper un ensemble de processus de telle sorte que lorsque l'un d'entre eux meurt, tous les autres processus de ce groupe meurent également.

Pour diverses raisons, l'application que nous avons consiste en 3 processus qui ne peuvent être réunis en un seul. Ces processus sont assez étroitement liés, il est donc logique de les faire apparaître et de les tuer ensemble. Par exemple, si l'un d'entre eux meurt, l'ensemble du système ne fonctionnera pas, il est donc logique de tuer les deux autres.

Cela peut-il être fait sous Linux ?

4voto

Je ne connais pas de moyen de le faire directement ; c'est-à-dire de laisser Linux s'occuper automatiquement du nettoyage des processus.  Je pense que vous devrez avoir un quatrième processus qui surveille l'état des trois autres et tue les deux autres quand l'un meurt.

S'il est possible d'avoir les trois processus démarrés par le même processus parent, c'est probablement la meilleure approche - faire en sorte que le processus parent fasse un wait() , qui sera retourné lorsque l'un des processus fils se terminera.  Si ce n'est pas une option écrivez un nouveau programme spécifiquement pour faire la surveillance.  Vous devrez lui indiquer les PIDs des trois processus.  Il peut vérifier s'ils sont en vie en essayant périodiquement de leur envoyer le signal 0.  (Le processus de surveillance devra être exécuté sous le même UID que les autres processus, ou en tant que root (UID 0), afin d'avoir la permission de leur envoyer des signaux).

3voto

Kamil Maciorowski Points 57004

En général, je soutiens La réponse de G-Man . Je voudrais vous présenter une solution rapide qui peut suffire dans certaines circonstances.

Que les trois exécutables soient foo , bar y baz . Les hypothèses :

  • vous pouvez les exécuter à la main ;
  • vous les exécutez tous sous le même utilisateur ;
  • vous exécutez au plus un foo un bar et un baz à un moment donné.

Au lieu de foo Ejecutar foo ; killall bar 2>/dev/null .
Au lieu de bar Ejecutar bar ; killall baz 2>/dev/null .
Au lieu de baz Ejecutar baz ; killall foo 2>/dev/null .

Si vous voulez exécuter foo en arrière-plan, la syntaxe correcte est la suivante :

{ foo ; killall bar 2>/dev/null ; } &

De même avec bar y baz . De cette façon, vous pouvez les exécuter à partir d'un seul Shell si vous le souhaitez.

La solution s'adapte à n'importe quel nombre raisonnable de processus. Lorsqu'un processus se termine, une chaîne de processus killall sera déclenché. Cela finira par jouer du thrash metal les tuer tous.

Notez que vous ne devriez pas démarrer un nouvel ensemble de processus avant d'être sûr que cette chaîne d'élimination est terminée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X