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

时间:2016-07-29 19:27:21

标签: bash service command

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

  /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"没打印!所以循环没有运行

2 个答案:

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