单独运行bash脚本或在另一个脚本中运行bash脚本会产生不同的变量值

时间:2018-07-19 04:54:33

标签: bash

我目前有2个bash脚本:

1)tomcat.sh

#!/bin/bash
case "$1" in
    'start')
        /home/testuser/start.sh
        ;;
    'status')
        /home/testuser/status.sh
        ;;
 esac

2)status.sh

#!/bin/bash
COUNT="$( ps -ef | grep tomcat| wc -l )"
echo ${COUNT}
if [ "${COUNT}" -eq 2 ]
then
    echo "Tomcat is running."
else
    echo "Tomcatis not running"
fi

当我通过以下两种方法检查状态时:

./tomcat.sh status${COUNT}回显值4

status.sh${COUNT}回显2的值。

我不确定为什么会有差异。我期望echo的两个值都匹配,因为它们实际上是在执行status.sh。我想念什么吗?

编辑:添加了我正在使用的实际搜索值。

1 个答案:

答案 0 :(得分:1)

tomcat.sh中的ps -ef运行时,您的status.sh仍在运行。因此,在使用tomcat.sh ps的情况下,至少找到以下条件:

  • tomcat.sh
  • 您要寻找的雄猫
  • grep tomcat(如果通过管道传输,则进程从右到左启动,因此当ps运行时,您的grep也已经在运行)

现在,我不确定第四位来自哪里。

如果仅运行状态脚本,则找不到tomcat.sh,因此结果较少。一个解决方案可能是使grep更加适合您的用例,或者使用更特定于您的任务的东西,例如pgrep(尽管pgrep java可能还会给您其他不需要的进程)。

可能的解决方案:

COUNT="$( ps -ef | grep "tomcat" | grep "org.apache.catalina.startup.Bootstrap" | wc -l )"

编辑:使用pidfile当然也是一种方法。在该问题中,您将显示类似于启动脚本的内容。因此,在启动时编写一个pidfile,然后在查询时读取并使用该pidfile,就可以知道该服务是否已启动。但是,如果有人使用其他方式启动该服务,它将无法正常工作。