我在等待后台工作时遇到了问题;我有两个脚本设置具有以下基本结构:
主要文字:
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
循环,它就再也看不到由它启动的任何子进程。
答案 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