脚本未等待 & 线程完成



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

脚本运行良好,但想要加快速度,我将mysqldump命令包装在while循环中,并使用{}&然后在'done'后面加了一个'wait',但是它不会等待。

相同的方法在使用'for'循环的类似脚本中工作得很好,在那里它等待所有线程完成,但我不确定为什么这个正在进展到脚本的后续步骤而不是'等待'。什么好主意吗?

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启动的进程。

确保您在启动它们的同一个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"
}  &

完成等待)

最新更新