bash 中的 while 循环使用 pgrep 检查服务是否存在

3 bash service command

有人可以向我解释为什么这不起作用吗?

  /usr/bin/mysqld_safe
  STATUS=$(/usr/bin/pgrep mysql | wc -l)
  while $STATUS -eq 0; do
    echo "$STATUS"
    sleep 1
  done
Run Code Online (Sandbox Code Playgroud)

它违背任何逻辑。是的,我不熟悉 bash :)

ps 我试图等到服务启动,但运行此命令后,甚至不会打印 echo“$STATUS”!所以循环没有运行

Joh*_*024 5

这运行mysqld_safe

  /usr/bin/mysqld_safe
Run Code Online (Sandbox Code Playgroud)

运行pgrep并将结果存储在 STATUS 中:

  STATUS=$(/usr/bin/pgrep mysql | wc -l)
Run Code Online (Sandbox Code Playgroud)

STATUS 永远不会再更新。此循环使用 STATUS 的常量固定值:

  while $STATUS -eq 0; do
    echo "$STATUS"
    sleep 1
  done
Run Code Online (Sandbox Code Playgroud)

请注意,while 循环中的测试格式错误。它应该是:

  while [ "$STATUS" -eq 0 ]; do
Run Code Online (Sandbox Code Playgroud)

要获得实时更新,pgrep应在循环内运行。此外,因为pgrep设置了退出代码,所以测试命令[...]是多余的:

要在没有 mysql 实例时保持循环运行:

while ! /usr/bin/pgrep mysql >/dev/null; do
Run Code Online (Sandbox Code Playgroud)

pgrep当找到匹配的进程时返回成功(退出代码=0)。由于您似乎希望在没有匹配进程时重复循环,因此我们使用 反转退出代码!

或者,将它们全部重新组合在一起:

/usr/bin/mysqld_safe
while ! /usr/bin/pgrep mysql >/dev/null; do
    echo "No such process"
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

假设mysqld_safe成功启动,while循环将永远不会运行。您应该只看到 while 循环无法mysqld_safe启动的输出。

如果您想要持续更新状态:

/usr/bin/mysqld_safe
while true; do
    /usr/bin/pgrep mysql >/dev/null
    echo "Current status: $?"
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)