脚本不等待线程完成

时间:2021-01-21 12:33:18

标签: bash shell parallel-processing scripting

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

脚本运行良好,但想要加快速度,我用 { }& 将 mysqldump 命令包装在 while 循环中,并在“完成”后添加了“等待”,但它不等待。

>

相同的方法在使用“for”循环的类似脚本中工作正常,它等待所有线程完成,但我不确定为什么这个方法会进入脚本的后续步骤而不是“等待” 'ing。 有什么想法吗?

 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

2 个答案:

答案 0 :(得分:2)

管道的各个部分在子 shell 中运行。您在子 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
}

答案 1 :(得分:0)

哦! 管道正在创建一个子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"

}  &

完成 等待 )