スクリプトはサービスの状態を正しく報告しません。

スクリプトはサービスの状態を正しく報告しません。

通常のサービスと同様に、状態を開始、停止、および確認するiperf用のスクリプトがあります。 「service iperf start」または「service iperf stop」を実行すると正常に動作します。 「service iperf status」を実行しようとすると、実行中でない場合でも常に実行中として返されます。

実行時間:

#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

スクリプトのステータスセクションの最初のエコーステートメントを読み取れないようです。正しい出力が得られていることを確認するために、コマンドラインのスクリプトの外部でpsコマンドを実行しました。サービスが実行されている場合は、スクリプトチェックに応じて「1」が返されます。実行していない場合は「0」を返すので、次のechoステートメントを実行し続ける必要がありますが、そうではありません。誰でもこの問題を解決する方法を教えてもらえますか?

RHEL 6.7 bashバージョン4.1.2を使用しています。

答え1

私の考えでは、あなたはルートを変更したいと思います。

if [ $is_running != "1" ];

~になる

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

これにより、実行中のインスタンスが存在しないときにiperfifが失敗し、必要なステータスメッセージが表示されます。現在作成されているとおり、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 ];

これは私の問題を解決しました。

関連情報