2016-07-28 25 views
3

Teil meines Code:Bash Warte funktioniert nicht

for i in "${r_arr[@]}" 
do 
    ${parallel_dir}parallel -j${cap} --semaphore --semaphorename a2_bootstrap_semaphore_${rnd} a2_exec ${i} ${temp_zmat_folder_path}${temp_zmat_folder}/ ${outs_folder} 
done 

wait 
elapsed_time=$(($SECONDS - $start_time)) 

rm -rf "${temp_zmat_folder_path}${temp_zmat_folder}" 
echo "Cleanup done." 
echo "`date +%d-%m-%y` `date +%T`: All processing finished in ${elapsed_time} seconds!" 

Wie Sie mir beginne eine Reihe von Aufgaben sehen GNU Parallel verwenden. Das Problem ist, dass die Bereinigung (rm) ausgeführt wird, bevor die letzte der parallelen Aufgaben überhaupt gestartet wird. Wie kann man ein solches Verhalten verhindern?

+0

Ich sehe keinen asynchronen Prozess in Ihrem Skript warten. No '&' anywhere ... – Kusalananda

+0

'wait' wartet nur auf direkte Kinder der Shell; es kann nicht dazu verwendet werden, auf Prozesse zu warten, die von anderen Prozessen gestartet wurden (wie zum Beispiel "parallel"). – chepner

Antwort

2

Gemäß ihrem Beispiel, sollten Sie diesen Befehl verwenden, zu warten, alle gestartet Jobs

parallel --semaphore --wait 

Beispiel abzuschließen (Von Manpage): Der Befehl sem ein Alias ​​für parallele --semaphore ist.

for i in *.log ; do 
    echo $i 
    sem -j10 gzip $i ";" echo done 
    done 
    sem --wait 
+0

Also muss der 'wait' Teil von' sem' selbst aufgerufen werden. Das habe ich in der Dokumentation verpasst, danke. – alex

0

Sam Daniels Antwort ist ganz richtig (außer Sie für die --semaphorename warten müssen, die Sie verwenden), aber sem ist sehr langsam. Verwenden Sie stattdessen eine Funktion:

doit() { 
    i="$1" 
    a2_exec ${i} ${temp_zmat_folder_path}${temp_zmat_folder}/ ${outs_folder} 
} 
export -f doit 
export temp_zmat_folder_path 
export temp_zmat_folder 
export outs_folder 
${parallel_dir}parallel -j${cap} doit ::: "${r_arr[@]}"