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

在bash中使用pgrep检查服务是否存在的while循环,bash,service,command,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、 我正试图等到服务启动,但在运行此命令后,甚至连回显“$STATUS”都不会打印出来!所以循环没有运行这运行的是mysqld\u safe: /usr/b

有人能给我解释一下为什么这样不行吗

  /usr/bin/mysqld_safe
  STATUS=$(/usr/bin/pgrep mysql | wc -l)
  while $STATUS -eq 0; do
    echo "$STATUS"
    sleep 1
  done
它违背任何逻辑。是的,我不精通bash:)


p、 我正试图等到服务启动,但在运行此命令后,甚至连回显“$STATUS”都不会打印出来!所以循环没有运行

这运行的是
mysqld\u safe

  /usr/bin/mysqld_safe
这将运行
pgrep
,并将结果存储在状态:

  STATUS=$(/usr/bin/pgrep mysql | wc -l)
状态不再更新。此循环使用恒定的固定状态值:

  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
在找到匹配进程时返回success(退出代码=0)。由于您似乎希望循环在没有匹配过程时重复,因此我们使用
反转退出代码

或者,把它们重新组合起来:

/usr/bin/mysqld_safe
while ! /usr/bin/pgrep mysql >/dev/null; do
    echo "No such process"
    sleep 1
done
假设
mysqld\u safe
成功启动,
while
循环将永远不会运行。您应该只看到while循环的输出是
mysqld\u safe
无法启动

如果您希望连续更新状态,请执行以下操作:

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

该死!我需要了解更多关于bash的信息,我以为我在为命令制作别名。还有一个问题,我在哪里读到关于-eq-ne等的内容?可以在@slaven上找到概述。请澄清:您尝试了代码的哪一部分?你想让它做什么?还有,当您尝试它时,实际发生了什么?我没有收到任何这样的过程通知。@Slaven,这似乎表明mysql已经启动,因为它应该在第一行中启动。在命令行中运行
pgrep mysql
进行验证。完成后我有另一个echo,它从未触发过。这太可疑了。我检查过mysqld_保险柜有无限循环。所以我把代码改成了使用服务。