Bash等待不起作用

时间:2016-07-28 18:13:34

标签: bash wait child-process gnu-parallel

我的部分代码:

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)。如何防止这种行为?

2 个答案:

答案 0 :(得分:2)

根据他们的示例,您应该使用此命令等待所有已启动的作业完成

parallel --semaphore --wait

示例(来自手册页): 命令sem是parallel --sephphore的别名。

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

答案 1 :(得分:0)

Sam Daniels的回答是完全正确的(除非你需要等待你使用的--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[@]}"