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 变量以反映当前状态。