Regrouper un ensemble de processus tels que, lorsqu’un meurt, tous les autres processus de ce groupe


5

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

Cela peut-il être fait sous Linux?

Réponses:


3

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

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

  • vous pouvez les exécuter à la main;
  • vous les exécutez tous avec le même utilisateur;
  • tu cours au plus un foo, un bar et une baz n'importe quand.

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

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

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

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

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

Notez que vous ne devriez pas démarrer un nouvel ensemble de processus avant de savoir avec certitude que cette chaîne d'abattage est terminée.


C'est malin. Toute raison particulière pour laquelle vous utilisez des accolades dans la commande au lieu de parenthèses; par exemple., (foo ; killall bar 2>/dev/null) &?
G-Man

@ G-Man Aucune raison. En raison de & il y a une sous-coque d'une manière ou d'une autre, je pense. S'il y a une différence, c'est une subtile; Je n'ai pas enquêté.
Kamil Maciorowski

4

Je ne connais aucun moyen de le faire directement; c'est-à-dire que Linux gère automatiquement le nettoyage du processus. Je crois que vous aurez besoin d'un quatrième processus qui surveille le statut des trois autres et tue les deux autres quand on meurt.

Si c'est possible faire démarrer les trois processus par le même processus parent, c’est probablement la meilleure approche - laisser le processus parent faire un wait(), qui reviendra lorsque l'un des processus enfants se termine. Si ce n’est pas une option, écrire un nouveau programme spécifiquement pour faire la surveillance. Vous devrez lui indiquer les PID 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 fonctionner 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).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.