2017-10-21 1 views
1

Ich habe 10 Befehle parallel ausführen:Callback basierend auf dem Exit-Status des Befehls in Bash Shell Scripting?

comdA & comdB & comdC & comdD 

...

Gibt es eine Möglichkeit, einen Rückruf auszuführen, wenn eine dieser Befehle einen Exit-Status ungleich 0 zurückgeben?

Wenn dies nicht mit bash möglich ist. Wie wäre es mit PHP? Kann ich

function exec_with_callback ($comd) { 

    shell_exec($comd); 
    callback(); 

} 

exec_with_callback("comdA"); 
exec_with_callback("comdB"); 
... 
but in parallel? 

Wenn nein, welche andere Sprache kann ich verwenden?

+1

https://stackoverflow.com/questions/9258387/bash-ampersand-operator – chiliNUT

Antwort

1

Sie können Ihre Befehle in einer Schleife ausführen und die Prozess-IDs speichern, indem Sie die Shell-Variable $! verwenden, die Ihnen die Prozess-ID des letzten Hintergrundjobs liefert.

Warten Sie, bis alle Prozesse mit wait <PID> in einer Schleife abgeschlossen sind.

n=0 
for pid in ${pidarray[@]}; do 
    wait ${pid} 
    exit_status_array[$n]=$? 
    ((n+=1)) 
done 

Jetzt Schleife durch die exit_status_array und den entsprechenden Befehl Rückruf bei Exit-Status ungleich 0 war

n=0 
for s in ${exit_status_array[@]}; do 
    if [[ ${s} -ne 0 ]]; then 
    commands[$n] & #callback 
    fi 
    ((n+=1)) 
done 

Sie den Vorgang wiederholen kann unbegrenzt, wenn Sie mit Hilfe dieser Logik wollen und eine Funktion usw. Aufruf

0

Vielleicht können Sie diese verwenden:

#!/bin/bash 

function check() { 
    $1 >/dev/null 2>&1 
    echo $? 
} 

command=("curl -sSL google.com" "echo 1" 'ping localhost -c 1' 'ls' 'false') 

for ((i=0;i<${#command[@]};i++)); do 
    echo "Command \"${command[$i]}\" returned value $(check "${command[$i]}")" 
    if (($(check "${command[$i]}") != 0)); then second=1; fi 
done 

if ((second == 1)); then 
    echo "I must run second group of commands because something have not worked!" 
    echo 2 
else 
    echo "All is gone without issues! Goodbye $USER!" 
    exit 0 
fi 

check function run command und return exit status, Befehle befinden sich im Befehlsarray und mit for loop können wir alle ausgeführten Befehle und ihren Exitstatus sehen. Wenn jemand den Exit-Status ungleich Null hat, hilft uns eine Variable, ein if auszuführen, wenn alle Befehle mit anderen Befehlen beendet sind.

Ausgabebeispiel

[email protected]:~/Scrivania$ bash example 
Command "curl -sSL google.com" returned value 0 
Command "echo 1" returned value 0 
Command "ping localhost -c 1" returned value 0 
Command "ls" returned value 0 
Command "false" returned value 1 
I must run second group of commands because something have not worked! 
2 
[email protected]:~/Scrivania$ bash example 
Command "curl -sSL google.com" returned value 0 
Command "echo 1" returned value 0 
Command "ping localhost -c 1" returned value 0 
Command "ls" returned value 0 
Command "true" returned value 0 
All is gone without issues! Goodbye darby! 
[email protected]:~/Scrivania$ 
0

Vorbereiten einer Datei myCommands einen Befehl für Zeile enthält:

echo "curl -sSL google.com" > myCommands.txt 
echo "echo 1"    >> myCommands.txt 
echo "ping localhost -c 1" >> myCommands.txt 
echo "ls"     >> myCommands.txt 
echo "false"    >> myCommands.txt 

und dann xargs verwenden und Rückgabecode von Xargs überprüfen.

xargs --arg-file myCommands.txt --max-procs 5 -I COMMAND sh -c "COMMAND" 
[ $? -eq 0 ] && echo "All command have sucessfully finish with retrun code 0" && echo "You need check the result" 

Wenn der Code Rückkehr gleich 0 ==> alle Befehle in myCommands Datei erfolgreich mit dem Returncode beenden haben 0

--max-procs: Führen Sie bis zu max-Procs Prozesse zu einem Zeitpunkt; Der Standardwert ist 1. Wenn max-procs 0 ist, werden xargs so viele Prozesse wie möglich gleichzeitig ausführen.