Bash 脚本不等待&;要完成的线程

Bash 脚本不等待&;要完成的线程,bash,shell,parallel-processing,scripting,Bash,Shell,Parallel Processing,Scripting,我有一个bash脚本,它根据数据库查询的结果转储特定的数据库。为了解决这个问题,我简化了脚本摘录 脚本运行得很好,但为了加快速度,我在while循环中用{}包装了mysqldump命令,并在“done”之后添加了一个“wait”,但它不等待 同样的方法在使用“for”循环的类似脚本中也可以正常工作,它等待所有线程完成,但我不确定为什么这一个会继续执行脚本的后续步骤而不是“wait”。 有什么想法吗 mysql --defaults-extra-file=XX.cnf -N -e "S

我有一个bash脚本,它根据数据库查询的结果转储特定的数据库。为了解决这个问题,我简化了脚本摘录

脚本运行得很好,但为了加快速度,我在while循环中用{}包装了mysqldump命令,并在“done”之后添加了一个“wait”,但它不等待

同样的方法在使用“for”循环的类似脚本中也可以正常工作,它等待所有线程完成,但我不确定为什么这一个会继续执行脚本的后续步骤而不是“wait”。 有什么想法吗

 mysql --defaults-extra-file=XX.cnf -N -e "SELECT dbname FROM table" | while IFS= read -r dbname
    do
    {
        echo "Doing stuff with  $dbname"
                
        mysqldump --defaults-extra-file=XX.cnf --opt  --databases  "$dbname" > dump_"${dbname}".sql 

        echo "${dbname} dump complete"
    }  &
done 
wait

管道的各部分在子外壳中运行。您在子shell中启动了后台进程。您不能等待由父shell中的子shell启动的进程。您只能等待由启动进程的同一shell启动的进程

确保在启动它们的同一个shell中等待。比如:

mysql --defaults-extra-file=XX.cnf -N -e "SELECT dbname FROM table" | {
  while IFS= read -r dbname; do
    {
       echo "Doing stuff with  $dbname"
       mysqldump --defaults-extra-file=XX.cnf --opt  --databases  "$dbname" > dump_"${dbname}".sql 
       echo "${dbname} dump complete"
    }  &
  done 
  wait
}
啊! 管道正在创建子shell

mysql --defaults-extra-file=XX.cnf -N -e "SELECT dbname FROM table" |  ( while IFS= read -r dbname
do
{
    echo "Dumping $dbname"

    mysqldump --defaults-extra-file=XX.cnf --opt  --databases  "$dbname" > dump_"${dbname}".sql


    echo "${dbname} dump complete"

}  &
完成 等待
)

我自己也记下了,并发布了我自己的答案:d