【问题标题】:check if service is running via bash script检查服务是否通过 bash 脚本运行
【发布时间】:2019-03-14 22:14:54
【问题描述】:

我有一个脚本sh startAWS.sh。 最重要的是,我检查了这个:

if [[ `ps -acx|grep postgres|wc -l` < 1 ]]; then
    echo "You need to start your Postgres service to run this script."

    ps -acx|grep postgres|wc -l

    exit 0
fi

当我跑步时,我得到了

⚡️  laravel  sh startAWS.sh                                                            
You need to start your Postgres service to run this script.                           
       6  

嗯...什么... ??????????‍♂️

我的 Postgres 正在运行,不应执行该 echo。

显示6,且6不小于1,该代码不应该被执行。

有人知道为什么我的 echo 会打印出来吗?

【问题讨论】:

  • if [ $(pgrep postgres | wc -l) -lt 1 ]; then怎么样
  • 正如@Mostafa 所说,您可能应该使用if [[ $(ps -acx|grep postgres|wc -l) -lt 1 ]]; then... $(...) 可以嵌套,不像反引号。

标签: linux bash shell ubuntu unix


【解决方案1】:

您需要执行数字比较,因此请在检查中使用 -lt 或 -gt。

Comparing numbers in Bash

if [[ `ps -acx|grep postgres|wc -l` -lt 1 ]];

【讨论】:

  • 真的,有那么敏感吗?
  • 是的,它是:)。我大部分时间都喜欢 bash,但像这样的问题可能会让你在沮丧中摸不着头脑
【解决方案2】:

这里有几个问题。

首先,正如@RameshNaidu 指出的那样,[[ &lt; ]] 内部正在进行字符串比较(即字母顺序)而不是数字,这会造成麻烦。这个错误导致的常见问题是字符串排序顺序与数字顺序不同——例如,[[ 10 &lt; 2 ]] 的计算结果为真,因为在字符排序顺序中“1”在“2”之前。但这不适用于这里,因为“6”在排序顺序中也位于“1”之后。发生的事情比这更微妙:wc -l 在行数之前打印多个空格,而空格确实在“1”之前,因此[[ " 6" &lt; 1 ]] 的计算结果为 true。

其次,ps | grep something 是检查进程是否正在运行的不好方法,因为(取决于确切的时间)ps 命令可能在其输出中包含“grep something”,而grep 命令将匹配那个。如果您有pgrep 可用,请改用它,因为它会自动避免此问题。另一个常见的解决方法是改用 grep "[s]omething" —— 括号会阻止它自己匹配,所以你不会得到这个额外的匹配。

但是还有一种更简单的方法来查看是否有任何匹配:与其使用wc 来计算匹配,只需使用grep -q(或pgrep -q)来抑制输出,然后检查其退出状态(成功 = 找到至少一个匹配项,因此使用 ! 否定它以检查 no 匹配项)。它看起来像以下之一:

if ! pgrep -q postgres; then
    echo "You need to start your Postgres service to run this script."

if ! ps -acx |grep -q "[p]ostgres"; then
    echo "You need to start your Postgres service to run this script."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2011-03-13
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多