Stoppen Sie alle untergeordneten Prozesse, wenn 1 davon den Exit-Code 1 zurückgibt.

Stoppen Sie alle untergeordneten Prozesse, wenn 1 davon den Exit-Code 1 zurückgibt.

Ich habe 2 oder mehr Build-Prozesse, die im Hintergrund laufen. Ich möchte alle Build-Prozesse stoppen, wenn einer davon mit einem anderen Code als 0 beendet wird.

./build-1.sh &
./build-2.sh &
./build-3.sh &
wait
#other steps

Derzeit verwende ich, waitwobei ich warten muss, bis alle Prozesse abgeschlossen sind. Aber wenn einer davon fehlschlägt, möchte ich alle anderen Builds stoppen. Wie mache ich das?

Antwort1

Was Sie suchen, wird allgemein als a bezeichnet named pipeund für die Interprozesskommunikation (IPC) verwendet. Es gibt zahlreiche hervorragende Dokumentationen zum Erstellen benannter Pipes in Bash, daher überlasse ich es Ihnen, den Code dafür zu schreiben.

Sobald Sie eine benannte Pipe eingerichtet haben, können Sie beispielsweise die PID aller Prozesse in die Pipe schreiben (unter Verwendung der speziellen Bash-Variable $$für die aktuelle PID) und sie dann in einer Schleife auf die Existenz aller PIDs prüfen. Wenn eine nicht mehr vorhandene PID gefunden wird (der Prozess ist gestorben oder wurde beendet), kann eine Aktion ausgeführt werden.

Sie würden so etwas in den entsprechenden Abschnitt Ihres Skripts einfügen. Bitte testen Sie es zuerst. :)

trap "rm -f $named_pipe" EXIT

# Assuming you have a file under $named_pipe with space-delimited PIDs
pids = $(< $named_pipe)
while :
do
  for pid in pids:
  do 
    if ! kill -0 $pid;
    then
      exit
    fi
  done
done

verwandte Informationen