Pflegen Sie 100 Instanzen eines laufenden Programms

12

Ich verwende derzeit Supervisord, um 100 Instanzen eines Skripts zu verwalten, die gleichzeitig ausgeführt werden. Wenn einer stirbt, startet er einen neuen.

Es scheint jedoch schwierig zu sein, eine größere Anzahl (> 300 Prozesse) beizubehalten, und ich suche nach einem Ersatz. Monit scheint nicht zu tun, was ich will, da es einzelne Skripte überwacht und nicht in der Lage zu sein scheint, 100 Instanzen desselben Skripts einfach zu überwachen.

Irgendwelche Vorschläge zu einem anderen Tool, das ich verwenden könnte?

jong
quelle
Was machen diese Skripte und warum möchten Sie mehrere Instanzen? Werden sie mit unterschiedlichen Argumenten / Umgebungen betrieben oder was?
Psusi
1
Würde ein einfaches Bash-Skript funktionieren? Etwa ... die Anzahl der ausgeführten Skriptprozesse zählen, bei weniger als 100 die fehlende Anzahl starten?
gabe.
3
Was versuchst du zu erreichen? Warum sterben einige der 300 Prozesse? Es gibt wahrscheinlich einen besseren Weg, um Ihre Aufgabe zu erledigen, nicht zuletzt, wenn 299 Instanzen eines Skripts weniger gut als 300 sind, liegt ein Fehler in Ihrer Anwendungsarchitektur vor. Das Neustarten von Prozessen, die gestorben sind, ohne zu verstehen, warum sie gestorben sind, führt häufig nur zu einem weiteren Tod und verursacht infolgedessen einen erheblichen Mehraufwand.
msw
Ich arbeite hier mit einem Legacy-System, das URLs verarbeitet, und jedes benötigt einen eigenen Thread (der in PHP geschrieben ist). Ja, die Architektur ist fehlerhaft, muss aber noch damit arbeiten ... Derzeit wird an einer neuen gearbeitet :)
jong

Antworten:

1

Sie können verwenden:

ps h --ppid $$ | wc -l

um die Anzahl der untergeordneten Prozesse aus einem Bash-Skript abzurufen (denken Sie daran, dass dies auch ps umfasst). Wenn Sie also 1000 Prozesse haben möchten, überprüfen Sie, ob dies 1001 zurückgibt. Wenn nicht, starten Sie sie mit:

cmd &

damit sie als untergeordnete Elemente des aktuellen Skripts ausgeführt werden (und daher in die Zählung einbezogen werden) Wenn Sie andere Prozesse erzeugen, müssen Sie den psBefehl ändern , um die gewünschten Prozesse zu filtern.

Dieser erste Befehl ist das Kernstück des Puzzles, es sollte nur ein bisschen länger dauern, bis Sie Ihr Skript haben.

Kevin Cox
quelle
0

Ich würde pgrep|wc -loder so etwas in einem einfachen Shell-Skript verwenden. Warten Sie eine Sekunde (oder weniger unter Linux, wenn Sie möchten) zwischen den einzelnen Überprüfungen mit sleep.

Nils
quelle
0

Wenn Ihr Skript abstürzt und einfach wieder in die Shell zurückkehrt, können Sie für jede Instanz ein Wrapper-Skript verwenden:

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

Oder Sie schreiben einen Wrapper, der die Skripte aufteilt und wait/waitpidzum Abfangen toter Prozesse verwendet.

user1181667
quelle
1
Ich würde dort am Ende wenigstens eine Pause einlegen, nur für den Fall, dass das Skript eine Terminal-Always-Fail-Bedingung hat (Slice ist voll, Konfigurationsdatei kann nicht gelesen werden usw.) für ein Stück CPU. Zusätzlich - 100 * (Bash-Prozess + anfänglicher Start-Fußabdruck der fehlgeschlagenen App) == möglicherweise eine nicht unerhebliche Menge an RAM)
synthesizerpatel