代码之家  ›  专栏  ›  技术社区  ›  Timothy T.

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

  •  0
  • Timothy T.  · 技术社区  · 8 年前

    我目前有两个bash脚本:

    1)Tomcat.sh公司

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

    2)状态.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 因为它们基本上是在执行 状态.sh . 我遗漏了什么吗?

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Veda    8 年前

    你的 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,就可以知道服务是否已启动。不过,如果有人用另一种方式启动服务,那就行不通了。

    推荐文章