今日在编写shell脚本中,需要使用后台运行子进程,达到并发的目的。为了能够让主进程等待子进程的结束,使用了wait命令,以下是局部模拟代码
<pre class="plain" name="code">sql="select ... from tb_test"
echo $sql | mysql -h"$ip" -P"$port" -u"$usr" -p"$pwd" "$db_name" -s | while read line
do
value=`echo $line | awk '{print $2}'`
$basepath/test.sh $value &
done
wait
但是在实际运行中我发现,主进程的运行时间不到1s,在子进程尚未完成只是便已经结束。
通过咨询,才明白,使用管道生成的while,是无法进行并发管理的。我理解为他新开了一个进程,他所生成的变量或者子进程,都无法由外部直接使用,要想做到并发管理,应该这样写
sql="select ... from tb_test"
echo $sql | mysql -h"$ip" -P"$port" -u"$usr" -p"$pwd" "$db_name" -s > tmp
while read line
do
value=`echo $line | awk '{print $2}'`
$basepath/test.sh $value &
done < tmp
wait
以后将继续更新对于wait的使用经验与细节