我有一个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"
} &
完成等待)