脚本未正确报告服务状态

脚本未正确报告服务状态

我有一个用于 iperf 的脚本,可以像典型服务一样启动、停止和检查它的状态。如果我发出“service iperf start”或“service iperf stop”,它会正常工作。当我尝试发出“服务 iperf 状态”时,它总是将其返回为正在运行,即使它没有运行。

运行时:

#service iperf status
/usr/bin/iperf pid 37567 is running!!!

不运行时:

# service iperf status
/usr/bin/iperf pid is running!!

这是我的整个脚本:

#!/bin/bash

# chkconfig: - 50 50
# description: iperf

DAEMON=/usr/bin/iperf
service=iperf
info=$(pidof /usr/bin/iperf)
is_running=`ps aux | grep -v grep | grep iperf | wc -l | awk '{print $1}'`

case "$1" in
      start)
              $DAEMON -s -D
              ;;
      stop)
              pidof $DAEMON | xargs kill -9
              ;;
      status)

             if [ $is_running != "1" ];
             then
                echo $DAEMON pid $info is running!!!
              else
                echo $DAEMON is NOT running!!!
              fi
              ;;
      restart)
              $DAEMON stop
              $DAEMON start
              ;;
      *)
              echo "Usage: $0 {start|stop|status|restart}"
              exit 1
              ;;
esac

它似乎无法读取脚本状态部分中的第一个 echo 语句。我已从命令行在脚本之外运行了 ps 命令,以验证我是否获得了正确的输出。如果服务正在运行,它将返回“1”,就像脚本检查的那样。如果它没有运行,它会返回“0”,因此它应该继续执行下一个 echo 语句,但事实并非如此。谁能告诉我如何解决这个问题?

我使用的是 RHEL 6.7 bash 版本 4.1.2

答案1

我想你想改变线路

if [ $is_running != "1" ];

成为

if [ "$is_running" != "0" ];

这样,当没有任何iperf运行实例时, if 就会失败,并打印所需的状态消息。正如目前所写的iperf,只有当恰好有 1 个进程时,它才会报告未运行。

答案2

我想到了。和使用ps有关系。我想当你调用“service iperf status”命令 ps 时总会找到一个带有 iperf 的进程。所以该值将始终为“1”,而不会是其他任何值。于是我用netstat来查找进程。在我的脚本中我使用:

IS_RUNNING=$(netstat -anp | grep ":5001" | grep "iperf" | awk '{print $7}' | cut -d"/" -f 2)

如果运行该命令,将导致该命令找到“iperf”

然后你可以这样写 if 语句:

if [ "$IS_RUNNING" = iperf ];

这解决了我的问题。

相关内容