如何解决脚本不等待线程完成
我有一个 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
解决方法
管道的各个部分在子 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"
} &
完成 等待 )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。