cygwin bash没有等待后台脚本完成

时间:2015-10-21 09:43:41

标签: bash shell cygwin wait background-process

我在等待后台工作时遇到了问题;我有两个脚本设置具有以下基本结构:

主要文字:

cat list_of_names.txt | while read name; do

  ./my_script_1.sh $name &

done

wait

./other_process.exe

my_script_1.sh:

name=$1

./prog_1.exe $name
./prog_2.exe $name
./prog_3.exe $name

只有在other_process.exe的所有后台实例都已运行完毕后,才能运行程序myscript.sh。问题是对wait的调用并不等待这些后台进程完成,而是主脚本立即运行other_process.exe(失败)。

在尝试调试时,我发现在jobs循环中调用while会正确显示正在运行的myscript.sh的所有后台实例。但是,在jobs命令之前调用wait之外的任何内容都不会返回任何内容。据我所知,一旦主脚本完成了while循环,它就再也看不到由它启动的任何子进程。

1 个答案:

答案 0 :(得分:0)

这不是cygwin特有的。 bash中的管道在子壳中启动它的命令。因此,后台进程是子shell的子进程,而不是主shell。避免使用管道,将其替换为流程替换<( ... )

#!/bin/bash
while read x ; do
    ( echo Start $x ; sleep $x ; echo Done $x ) &
done < <( echo $'1\n2' )
echo Done start
wait
echo Done all