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
但这似乎并没有任何工作,导致一个语法错误,或通常是一个无限循环。
当你这样做:
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。这将在每次迭代中重新评估,因此循环将在过程完成时结束。
谢谢!这正是我想要的。我遇到的一个问题,虽然是ps上的”>& - “ -p line。我认为这是你用来停止输出,并将其改为“&>/dev/null”,并修复了我遇到的错误之前,它说“ps:write error:Bad file描述符“ –
这是'&&',带有破折号,而不是'i'。这意味着“密切的标准输入和输出”。重定向到'>/dev/null'就是一样好。 –
对不起,我看到它之后编辑了我的评论 - 这是将它放入SO中时的拼写错误。我在做&&,但很高兴我的假设是正确的。再次感谢! –
请看看:http://www.shellcheck.net/ – Cyrus
谢谢,但唯一说的是“壳消除歧义((不同或根本没有。如果第一个(应该启动一个子shell,添加一个“我在第一个括号后面加了一个空格,但它仍然是一个无限循环 –