Bash while循环等待mysql导入

时间:2016-11-27 18:12:27

标签: mysql bash while-loop

我正在尝试创建一个bash脚本来初始化数据库。现在一切进展顺利 - 我已经能够创建数据库,创建用户,并授予用户对数据库的权限。

现在要运行导入脚本。我可以通过运行mysql命令来完成它,但是用户可能会在那里坐一两分钟但没有反馈。

所以我决定在命令运行时使用微调器。

i=0
spin='-\|/'
echo "Beginning Data Import. This may take a while..."
while ((mysql -u$newUser -p$newPassword -D$dbName < import.sql) &>/dev/null &); do
  i=$(( (i+1) %4 ))
  printf "\rImporting milestone SQL (All data)... ${spin:$i:1}"
  sleep .3
done

我已经使用了这个命令的其他变体,但它们似乎都导致了

a)微调器永远地继续前进。它永远不会停止,或

b)它多次运行mysql import命令

我尝试过谷歌搜索,但似乎找不到任何能回答我问题的内容。大多数似乎表明我可以做类似

的事情
while ((mysql -u$newUser -p$newPassword -D$dbName < l1jdb_m9.sql) &>/dev/null &) != 1 

但这似乎也不起作用,导致语法错误,或者通常是无限循环。

1 个答案:

答案 0 :(得分:2)

执行此操作时:

while ((mysql -u$newUser -p$newPassword -D$dbName < l1jdb_m9.sql) &>/dev/null &)

... shell正在后台启动mysql

(mysql -u$newUser -p$newPassword -D$dbName < l1jdb_m9.sql) &>/dev/null &的结果几乎总是一个真正的值:也就是说,启动命令会成功。 while收到此真实结果并开始迭代。在循环结束时,它再次运行表达式,以查看它是否应该继续迭代。由于表达式再次运行,mysql在后​​台再次执行,并再次返回成功。

循环将永远执行此操作,在每次迭代时在后台启动新的mysql命令。由于你是在后台发布的,所以没有什么可以等待结果;这是永远不会发生的,它总是会回归真实。

如果您想等待命令完成,您可以执行以下操作:

mysql -u$newUser -p$newPassword -D$dbName < import.sql &>/dev/null &
mysql_pid=$!
while (ps -p $mysql_pid >&-);
do
  i=$(( (i+1) %4 ))
  printf "\rImporting milestone SQL (All data)... ${spin:$i:1}"
  sleep .3
done

捕获子进程的PID($!),然后使用ps -p检查每个循环迭代以查看进程是否仍在运行。 >&-会丢弃输出,如果进程正在运行,ps将返回true,否则返回false。这将在每次迭代时重新评估,因此循环将在过程完成时结束。