检查服务是否通过bash脚本运行

时间:2019-03-14 22:14:54

标签: linux bash shell ubuntu unix

我有一个脚本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正在运行,不应执行该回显。

它显示6,并且6不小于1,则不应执行代码。

有人知道我为什么要回显打印吗?

2 个答案:

答案 0 :(得分:1)

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

Comparing numbers in Bash

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

答案 1 :(得分:1)

这里有两个问题。

首先,正如@RameshNaidu指出的那样,res.status(404).render('404', { pageTitle: 'Page Not Found', path: 'Error'}); 内部正在进行字符串比较(即字母顺序)而不是数字比较,这会造成麻烦。此错误导致的常见问题是字符串排序顺序与数字顺序不同-例如,[[ < ]]的计算结果为true,因为字符排序顺序中“ 1”位于“ 2”之前。但这在这里不适用,因为“ 6”在排序顺序上也排在“ 1”之后。发生的事情比这更妙:[[ 10 < 2 ]]在行数之前打印许多空格,而空格确实在“ 1”之前,因此wc -l的计算结果为true。 / p>

第二,[[ " 6" < 1 ]]是检查进程是否正在运行的一种不好方法,因为ps | grep something命令(取决于确切的时间)可能在其输出中包含“ grep something”,而{ {1}}命令将与此匹配。如果您有ps可用,请改用它,因为它可以自动避免此问题。另一个常见的解决方法是改用grep -方括号可防止其自身匹配,因此您不会得到额外的匹配。

但是还有一种更简单的方法来查看是否存在匹配项:与其使用pgrep来计算匹配项,不如使用grep "[s]omething"(或wc)来抑制输出,并且只需检查其退出状态即可(成功=找到至少一个匹配项,因此请用grep -q对其进行否定以检查是否为匹配项)。看起来像其中之一:

pgrep -q

!
相关问题