有人可以向我解释为什么这不起作用吗?
/usr/bin/mysqld_safe
STATUS=$(/usr/bin/pgrep mysql | wc -l)
while $STATUS -eq 0; do
echo "$STATUS"
sleep 1
done
它无视任何逻辑。是的,我不熟悉bash:)
P.S。我试图等到服务结束,但在运行这个甚至是回声之后#$; $ STATUS"没打印!所以循环没有运行
答案 0 :(得分:3)
这会运行mysqld_safe
:
/usr/bin/mysqld_safe
运行pgrep
并将结果存储在STATUS:
STATUS=$(/usr/bin/pgrep mysql | wc -l)
STATUS永远不会再次更新。这使用常量固定值STATUS:
循环 while $STATUS -eq 0; do
echo "$STATUS"
sleep 1
done
请注意,while循环中的测试格式不正确。它应该是:
while [ "$STATUS" -eq 0 ]; do
要获得实时更新,应在循环内运行pgrep
。此外,由于pgrep
设置了退出代码,因此测试命令[...]
是多余的:
在没有mysql实例的情况下保持循环运行:
while ! /usr/bin/pgrep mysql >/dev/null; do
pgrep
在找到匹配的进程时返回成功(退出代码= 0)。由于您似乎希望在没有匹配过程时重复循环,因此我们使用!
反转退出代码。
或者,将它们全部重新组合在一起:
/usr/bin/mysqld_safe
while ! /usr/bin/pgrep mysql >/dev/null; do
echo "No such process"
sleep 1
done
假设mysqld_safe
成功启动,while
循环将永远不会运行。您应该只看到来自mysqld_safe
的while循环的输出无法启动。
如果您想要连续状态更新:
/usr/bin/mysqld_safe
while true; do
/usr/bin/pgrep mysql >/dev/null
echo "Current status: $?"
sleep 1
done
答案 1 :(得分:2)
或许解决方案可能是这样的
STATUS=0
while [ $STATUS -eq 0 ]; do
echo $STATUS
sleep 1
STATUS=$(/usr/bin/pgrep mysql | wc -l)
done
需要更新循环中的STATUS
变量以反映当前状态。