Gérer 100 instances d'un programme en cours d'exécution

12

J'utilise actuellement supervisord pour gérer 100 instances d'un script s'exécutant simultanément. Si quelqu'un meurt, il en démarre un nouveau.

Cependant, il semble avoir du mal à maintenir un plus grand nombre (> 300 processus) et je cherche un remplaçant. Monit ne semble pas faire ce que je veux car il surveille les scripts individuels et ne semble pas pouvoir facilement regarder 100 instances du même script.

Des suggestions sur un autre outil que je pourrais utiliser?

jong
la source
Que font ces scripts et pourquoi voulez-vous plusieurs instances? Sont-ils exécutés avec différents arguments / environnement ou quoi?
psusi
1
Un simple script bash fonctionnerait-il? Quelque chose comme ... compter le nombre de processus de script en cours d'exécution, si moins de 100, démarrer le nombre qui manque?
gabe.
3
Qu'est-ce que vous essayez d'accomplir? Pourquoi certains des 300 processus meurent-ils? Il existe probablement un meilleur moyen d'accomplir votre tâche, et non des moindres, si 299 instances d'un script en cours d'exécution sont inférieures à 300, quelque chose est défectueux avec l'architecture de votre application. Les processus de redémarrage qui sont morts sans comprendre pourquoi ils sont morts entraîneront souvent un autre décès et entraîneront des frais généraux conséquents.
msw
Je travaille avec un système hérité ici qui fait le traitement des URL et chacun a besoin de son propre fil (écrit en PHP). Oui, l'architecture est imparfaite, mais doit encore fonctionner avec elle ... Travailler sur une nouvelle en ce moment :)
jong

Réponses:

1

Vous pouvez utiliser:

ps h --ppid $$ | wc -l

pour obtenir le nombre de processus enfants à partir d'un script bash (rappelez-vous que cela inclut ps). Donc, si vous voulez avoir 1000 processus, vous vérifiez si cela renvoie 1001. Sinon, lancez-les avec:

cmd &

afin qu'ils s'exécutent en tant qu'enfants du script actuel (et donc soient inclus dans le décompte.) Vous pouvez ensuite dormir un peu, puis vérifier à nouveau dans une boucle pour toujours. Une chose à garder à l'esprit est que si vous générez d'autres processus, vous devrez modifier la pscommande pour filtrer les processus souhaités.

Cette première commande est la pièce maîtresse du puzzle, elle devrait être un peu plus jusqu'à ce que vous ayez votre script.

Kevin Cox
la source
0

J'utiliserais pgrep|wc -lou quelque chose comme ça dans un simple script shell. Attendez une seconde (ou moins sous Linux si vous le souhaitez) entre chaque vérification avec sleep.

Nils
la source
0

Si votre script meurt et revient simplement au shell, vous pouvez utiliser un script wrapper pour chaque instance:

while [ 1 == 1 ] ; do /path/to/script ; done

ou vous écrivez un wrapper qui bifurque les scripts et les utilise wait/waitpidpour intercepter les processus morts.

user1181667
la source
1
Je ferais au moins un sommeil là-dedans à la fin juste au cas où le script aurait une condition de terminal toujours défaillant (la tranche est pleine, ne peut pas lire le fichier de configuration, etc.). Sinon, vous pourriez avoir 100 processus en cours pour une tranche de CPU. De plus - 100 * (processus bash + empreinte de démarrage initiale de l'application défaillante) == potentiellement une quantité non négligeable de RAM)
synthesizerpatel