2017-11-25 3 views
1

Ausführen von I for-Schleife in einem Gnu parallel verwenden möchte, um eine Funktion in einem Bash-Skript exec und ich bin um herauszufinden, nicht in der Lage, wie von der Info ich online einsehen. Zum Beispiel:eines for-Schleife mit Gnu parallel

#!/bin/bash 

get_racks(){ 
query that outputs a list of racks 
} 

get_hosts() { 
query that outputs a list of hosts by rack(passed as param to the func) 
} 

get_gw() { 
query that outputs a list of gateways 
} 

check_ping() { 
HOSTS=(`get_hosts`) 
COUNTER=0 
while [ $COUNTER -lt $SIZE ] ; do 
    ssh $HOSTS "ping -c 5 ${GATEWAYS[$COUNTER]} " ; 
    COUNTER=$((COUNTER+1)) ; 
done 
} 

RACKS=(`get_racks`) 
HOSTS=(`get_hosts`) 
GWS=(`get_gw`) 
SIZE=${#GWS[@]} 
COUNTER=0 

for rack in ${RACKS[@]}; do 
    parallel check_ping | tee output.txt 
done 

Ich möchte das auszuführen, für Schleifen und was parallel geschieht im Inneren, während die Anzahl der gleichzeitig Arbeitsplätze und Ausgabe alles in einer einzigen Datei zu steuern. Die letzte Datei sollte alle Daten enthalten, die die Funktion zurückgibt, und auch auf stdout drucken. Außerdem hat die check_ping einen Teil zu einer entfernten Maschine von sshing und GW Pingen, ist dieser Teil mit einem benutzerdefinierten Befehl ssh tatsächlich parallel geschieht, werden wir, dass ssh auf alle Hosts in der Anordnung parallel und Pings einen GW haben.

Dank viel

Antwort

1

Ich glaube, Sie dies wünschen:

RUN_COMMANDS() { 
... 
} 

export -f RUN_COMMANDS 

parallel -j4 RUN_COMMANDS ::: “${FILES[@]}” | tee output.txt 

Sie parallel -k ... wollen, wenn die Reihenfolge wichtig ist.

+0

Sagt, dass es Befehl RUN_COMMANDS nicht finden kann. –

+0

Hoppla, ein Leerzeichen hier 'RUN_COMMANDS() {' –

+0

Leider dies ein Syntaxfehler in meinem Pseudo-Code war, war der eigentliche Code in Ordnung. Ich bekomme immer noch diesen Fehler –

0

Parallel kann in sehr ähnlicher Weise zu xargs verwendet werden, es hat sogar die params von xargs umgesetzt.

#!/bin/bash 

RUN_COMMANDS(){ 
    ...... 
} 

FILES=(file1 file2 file3) 

echo ${FILES[@]} | parallel RUN_COMMANDS | tee output.txt 
1
#!/bin/bash 

get_racks(){ 
    # query that outputs a list of racks 
    echo rack01 
} 
export -f get_racks 

get_hosts() { 
    # query that outputs a list of hosts by rack(passed as param to the func) 
    echo host01 
    echo host02 
} 
export -f get_hosts 

get_gw() { 
    # query that outputs a list of gateways 
    echo gw1 
    echo gw2 
} 
export -f get_gw 

ping_gw() { 
    rack="$1" 
    get_hosts "$rack" | parallel -S - --onall ping -c 5 ::: "`get_gw`" 
} 
export -f ping_gw 
get_racks | parallel ping_gw && echo All hosts and gws are up 

Wenn Sie mehr Funktionen/Variablen/Aliase haben dann erwägen env_parallel stattdessen verwenden. Auf diese Weise wird env_parallel den Export für Sie tun.

+0

danke für die Antwort @OleTange, aber ich bekomme '/ bin/bash: ping gw: Befehl nicht gefunden'. Ich habe in einem anderen Thread gelesen, dass Sie gesagt haben, dass es auf einen Fehler mit der Parallelversion zurückzuführen sein könnte? –

+0

Kopieren Sie den vollständigen Text? Ich habe gerade alle Versionen von GNU Parallel seit 2014 getestet. Sie alle funktionieren. Es ist unwahrscheinlich, dass es ein Fehler in GNU Parallel ist. –

+0

Ja, Befehl wird immer noch nicht gefunden. Ich führe es als ein normales Benutzerkonto aus. –