我正在尝试创建一个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
但这似乎也不起作用,导致语法错误,或者通常是无限循环。
答案 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。这将在每次迭代时重新评估,因此循环将在过程完成时结束。