bash 中的 while 循环使用 pgrep 检查服务是否存在
while loop in bash that uses pgrep to check if service exists
有人可以向我解释为什么这不起作用吗?
/usr/bin/mysqld_safe
STATUS=$(/usr/bin/pgrep mysql | wc -l)
while $STATUS -eq 0; do
echo "$STATUS"
sleep 1
done
这违背了任何逻辑。是的,我不精通 bash :)
p.s。我试图等到服务启动,但在 运行 之后甚至没有打印 echo "$STATUS"!所以循环不是 运行
这 运行s mysqld_safe
:
/usr/bin/mysqld_safe
这 运行s 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 的实例时保持循环 运行ning:
while ! /usr/bin/pgrep mysql >/dev/null; do
pgrep
returns 找到匹配进程时成功(退出代码=0)。由于您似乎希望在没有匹配过程时重复循环,因此我们使用 !
.
反转退出代码
或者,将它们全部放回原处:
/usr/bin/mysqld_safe
while ! /usr/bin/pgrep mysql >/dev/null; do
echo "No such process"
sleep 1
done
假设mysqld_safe
成功启动,while
循环永远不会运行。您应该只会看到 while 循环的输出是 mysqld_safe
fails to start.
如果您想要持续更新状态:
/usr/bin/mysqld_safe
while true; do
/usr/bin/pgrep mysql >/dev/null
echo "Current status: $?"
sleep 1
done
也许解决方案可能是这样的
STATUS=0
while [ $STATUS -eq 0 ]; do
echo $STATUS
sleep 1
STATUS=$(/usr/bin/pgrep mysql | wc -l)
done
需要更新循环内的 STATUS
变量以反映当前状态。
有人可以向我解释为什么这不起作用吗?
/usr/bin/mysqld_safe
STATUS=$(/usr/bin/pgrep mysql | wc -l)
while $STATUS -eq 0; do
echo "$STATUS"
sleep 1
done
这违背了任何逻辑。是的,我不精通 bash :)
p.s。我试图等到服务启动,但在 运行 之后甚至没有打印 echo "$STATUS"!所以循环不是 运行
这 运行s mysqld_safe
:
/usr/bin/mysqld_safe
这 运行s 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 的实例时保持循环 运行ning:
while ! /usr/bin/pgrep mysql >/dev/null; do
pgrep
returns 找到匹配进程时成功(退出代码=0)。由于您似乎希望在没有匹配过程时重复循环,因此我们使用 !
.
或者,将它们全部放回原处:
/usr/bin/mysqld_safe
while ! /usr/bin/pgrep mysql >/dev/null; do
echo "No such process"
sleep 1
done
假设mysqld_safe
成功启动,while
循环永远不会运行。您应该只会看到 while 循环的输出是 mysqld_safe
fails to start.
如果您想要持续更新状态:
/usr/bin/mysqld_safe
while true; do
/usr/bin/pgrep mysql >/dev/null
echo "Current status: $?"
sleep 1
done
也许解决方案可能是这样的
STATUS=0
while [ $STATUS -eq 0 ]; do
echo $STATUS
sleep 1
STATUS=$(/usr/bin/pgrep mysql | wc -l)
done
需要更新循环内的 STATUS
变量以反映当前状态。