Kontext:
Benutzer stellen mir ihre benutzerdefinierten Skripte zur Ausführung zur Verfügung. Diese Skripte können beliebig ähnlich sein wie Skripte zum Starten mehrerer GUI-Programme und Backend-Dienste. Ich habe keine Kontrolle darüber, wie die Skripte geschrieben werden. Diese Skripte können blockierend sein, dh die Ausführung wartet, bis alle untergeordneten Prozesse (Programme, die nacheinander ausgeführt werden) beendet werden
#exaple of blocking script
echo "START"
first_program
second_program
echo "DONE"
oder nicht blockierender Typ, dh solche, die untergeordnete Prozesse im Hintergrund abspalten und so etwas wie beenden
#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"
Was versuche ich zu erreichen?
Vom Benutzer bereitgestellte Skripte können von einem der beiden oben genannten Typen oder einer Mischung aus beiden sein. Meine Aufgabe ist es, das Skript auszuführen und zu warten, bis alle von ihm gestarteten Prozesse beendet sind, und dann den Knoten herunterzufahren. Wenn es sich um einen blockierenden Typ handelt, ist der Fall ganz einfach, dh Sie erhalten die PID des Skriptausführungsprozesses und warten, bis ps -ef | grep -ef PID keine Einträge mehr hat. Nicht blockierende Skripte bereiten mir Probleme
Gibt es eine Möglichkeit, eine Liste der PIDs aller untergeordneten Prozesse abzurufen, die durch die Ausführung eines Skripts erzeugt wurden? Alle Hinweise oder Hinweise werden sehr geschätzt
grep
, nur ps –udummy_user
. Schauen Sie sich auch Prozessgruppen an.
ps
ohne Argumente auflisten (sollte nur bash
und ps
am Anfang sein). Starten Sie dort Ihr Skript. Warten Sie danach, bis ps | wc -l
der erwartete Wert erreicht ist.
pid$(foo.sh; echo $!)
das Ihnen die PID von gibt,foo.sh
damit Sie sie dann verwenden könnenps --ppid
. Wird es funktionieren?