2016-03-18 10 views
2

Ich habe eine Bash-Skripte, in denen ich andere Skripte aufrufen, um parallel zu laufen. Mit dem Befehl wait kann ich warten, bis alle parallelen Prozesse beendet sind. Aber ich möchte wissen, ob alle Prozesse, die parallel im Hintergrund ausgeführt wurden, erfolgreich ausgeführt wurden (mit Return-Code 0).Ergebnisse von parallelen Ausführungen in Bash

Mein Code sieht so aus:

--calling multiple processes to execute in backgroud 
process-1 & 
process-2 & 
process-3 & 
wait 
--after parallel execution finishes I want to know if all of them were successful and returned '0' 
+1

Mögliches Duplikat von [Shell - Get-Exit-Code des Hintergrundprozesses] (http://stackoverflow.com/questions/1570262/shell-get-exit-code-of-background-process) – dfogni

Antwort

1

Sie wait -n verwenden können, die den Exit-Code des nächsten Auftrags zurückgibt, beendet. Nennen Sie es einmal für jeden Hintergrundprozess.

process-1 & 
process-2 & 
process-3 & 
wait -n && wait -n && wait -n 
+0

My Bash 4.2.37 hat Nein, warte. Meintest du 'warten ' ('warten [n ...]' auf der man-Seite)? –

+0

Ja. Sogar ich habe das nicht – nishant

+0

Das '' 'warten [-n]' '' Ding kann hier gefunden werden: https://www.gnu.org/software/bash/manual/bashref.html – dekkard

0

Warte -n die richtige Lösung scheint, aber da es nicht in bash 4.2.37 ist, können Sie diesen Trick versuchen:

#!/bin/bash  
(
    process-1 || echo $! failed & 
    process-2 || echo $! failed & 
    process-2 || echo $! failed & 
    wait 
) | grep -q failed 

if [ $? -eq 0 ]; then 
    echo at least one process failed 
else 
    echo all processes finished successfully 
fi 

So stellen Sie sicher, dass die Zeichenfolge „nicht bestanden“ wird nicht zurückgegeben durch die Prozesse selbst, während sie einen tatsächlichen Erfolg haben. Auch Sie könnten Prozesse mit stdin und stderr laufen umgeleitet do/dev/null mit process-1 &>/dev/null

0

Ich habe ein Tool geschrieben, dass die Lösungen etwas vereinfacht: https://github.com/wagoodman/bashful

Sie geben eine Datei beschreiben, was Sie ausführen möchten. ..

# awesome.yaml 

tasks: 
    - name: My awesome tasks 
    parallel-tasks: 
     - cmd: ./some-script-1.sh 
     - cmd: ./some-script-2.sh 
     - cmd: ./some-script-3.sh 
     - cmd: ./some-script-4.sh 

... und es wie so laufen:

bashful run awesome.yaml 

Dann wird es Ihre Aufgaben parallel zu einer vertikalen pr laufen Ogress-Leiste zeigt den Status jeder Aufgabe. Fehler werden rot angezeigt und das Programm wird mit 1 beendet, wenn Fehler gefunden wurden (der Exit erfolgt nach Abschluss des parallelen Blocks).

Verwandte Themen