通常のサービスと同様に、状態を開始、停止、および確認する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" ];
これにより、実行中のインスタンスが存在しないときに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 ];
これは私の問題を解決しました。