2016-07-28 43 views
3

部分:猛砸等待不工作的我的代碼

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!" 

正如你看到的,我開始使用GNU Parallel多項任務。問題是清理(rm)在最後一個並行任務開始之前執行。如何防止這種行爲?

+0

我沒有看到異步進程在您的腳本中等待。沒有'&'任何地方... – Kusalananda

+0

'wait'只等待殼的直接子;它不能用於「等待」由其他進程啓動的進程(比如「並行」)。 – chepner

回答

2

按照他們的榜樣,您應該使用這個命令來等待所有的開始作業完成

parallel --semaphore --wait 

例(從手冊頁): 命令SEM是並行--semaphore的別名。

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

所以'wait'部分必須從'sem'本身調用。我錯過了文檔,謝謝。 – alex

0

薩姆·丹尼爾斯的回答是完全正確的(除非你需要等待您使用--semaphorename),但sem實在是太慢了。考慮使用函數:

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[@]}"