Bash while循环等待mysql导入

问题描述:

我试图创建一个bash脚本来初始化一个数据库。现在一切进展顺利 - 我已经能够创建数据库,创建用户,并授予用户对数据库的权限。Bash while循环等待mysql导入

现在说到运行导入脚本。我可以简单地通过运行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 

我用这个命令的其他变化,但他们似乎都导致微调只是不断会永远要么

一)。它永远不会停止,或

二)多次

我试着用搜索引擎,但似乎无法找到任何回答我的问题运行mysql的输入命令。大多数人似乎表明我可以这样做

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

但这似乎并没有任何工作,导致一个语法错误,或通常是一个无限循环。

+0

请看看:http://www.shellcheck.net/ – Cyrus

+0

谢谢,但唯一说的是“壳消除歧义((不同或根本没有。如果第一个(应该启动一个子shell,添加一个“我在第一个括号后面加了一个空格,但它仍然是一个无限循环 –

当你这样做:

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

...壳在后台启动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。这将在每次迭代中重新评估,因此循环将在过程完成时结束。

+0

谢谢!这正是我想要的。我遇到的一个问题,虽然是ps上的”>& - “ -p line。我认为这是你用来停止输出,并将其改为“&>/dev/null”,并修复了我遇到的错误之前,它说“ps:write error:Bad file描述符“ –

+0

这是'&&',带有破折号,而不是'i'。这意味着“密切的标准输入和输出”。重定向到'>/dev/null'就是一样好。 –

+0

对不起,我看到它之后编辑了我的评论 - 这是将它放入SO中时的拼写错误。我在做&&,但很高兴我的假设是正确的。再次感谢! –