2016-03-30 11 views
0

ここで、アプリケーションが既にポートをリッスンしているかどうかを知りたいBashスクリプトを作成したいと思います。コマンドnetstatを使用してください。Bashスクリプトの実行方法 "if"ループ中の "while" 10分制限付き

ポートが既に聴取されていた場合は、結果を表示します。

もしそうでなければ、スクリプトはnetstatコマンドを10分の時間制限で繰り返し、10分を超えるとコマンドは実行されません。結果はエラーです。

の端末に手動netstatコマンドを実行している場合:

netstat -atn | grep 8779 

結果を:

[email protected]:~$ erp-enterprise/bin$ netstat -atn | grep 8779 
tcp6  0  0 :::8779     :::*     LISTEN 

は私が作ったスクリプト以下、次は何?

#!/bin/bash 
NETSTAT=`netstat -ant | grep :::8779` 

echo $NETSTAT 
VAR_ERR="Port APP 8779, not listen !" 
VAR_SUCS="Port APP 8779, LISTEN" 

while [[ "$NETSTAT" = "" ]] ; 
do 
    echo $NETSTAT 
    if [[ -z "$NETSTAT" ]]; 
    then 
      echo $VAR_ERR 
      NETSTAT=`netstat -ant | grep :::8082` 
    else 
      echo $VAR_SUCS 
      exit 0 
done 
echo $VAR_SUCS 

アプリケーションがポートをリッスンしていない場合、スクリプトは引き続きループします。

結果:

[email protected]:~$ ./listen_port.sh 
Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

アプリケーションが既にポートを聴いている場合、スクリプトは停止し、その結果を取り出します。

[email protected]:~$ ./listen_port.sh 
Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8082, not listen ! 

Port APP 8779, LISTEN 

停止するスクリプトに時間制限を与えるにはどうすればよいですか?上記のコマンドが/path/to/your_script.shを開始し、それはそれ自身の上で終了していない場合は、10分後に終了します

timeout 10m /path/to/your_script.sh 

+0

わからない*時間制限はありますが、ループ内で何かをやり直すことができます一定の時間が経過するか、['timeout'](http://linux.die.net/man/1/timeout)でコマンドを実行することができます。 – Biffen

+0

ああ、先生。上で説明して、私のbashスクリプトを表示しようとしましたが、スクリプトを続けるにはどうすればいいですか?どのようにスクリプトの追加?だから私はそれを意味します。 – Yuday

+0

スクリプト内でタイムアウト*をしたいのですか、それともタイムアウトで実行しますか? (そして、私を 'サー'と呼んではいけない。) – Biffen

答えて

4

あなたがtimeoutコマンドを使用することができます。

さらに読み:man timeout

2

を私はhek2mglのソリューション@好きですが、あなたはあなたのスクリプトの中でそれを行うにはしたくない場合は、経過した時間を確認するためにSECONDS変数を使用することができます。だからあなたのループは、文字列が空であるかどうかのための組み込みテストを使用する

while [[ "$NETSTAT" = "" ]] && [[ $SECONDS -lt 600 ]]; 

または

while [[ -z "$NETSTAT" ]] && [[ $SECONDS -lt 600 ]]; 

のようなものに条件を変えることができる

あなたはないbashスクリプト内からそれを行うことができます
0

他のツールに頼っている:

#! /bin/bash 

trap 'echo "error after retrying for $secs"; exit 1' USR1 

secs=600 

{ sleep $secs; kill -s USR1 0; } & 

while : 
do 
    netstat -ant | grep -q :::8082 && exit 0 
    sleep 1 
done 
関連する問題