2016-09-16 11 views
1

特定のポート範囲でポートが使用されているかどうかを調べる必要があります。Bash Scriptポートの使用状況を取得する

私はphp-fpmプールを作成するためのスクリプトを設定しており、使用されていない次の使用可能ポートを確認できるようにしたいと考えています。

netstat -ntpl | grep [0-9]:${1:-11211} -q ; 

は、私はその特定のポートが使用中の場合は見てのために必要なものを私取得しますが、私はポート範囲のためにこれを行うことができますか?言ってよ... 11211 - 12655

範囲をループし、次の "found"の位置で停止する必要がありますか? しかし、これは私のすべてを返す1です。

for i in {11212..12655} 
do 
    netstat -ntpl | grep [0-9]:${1:-i} -q ; 
    echo $i:$? 
done 

    i=11212; 
END=12655; 
while [ $i -le $END ]; do 
    netstat -ntpl | grep [0-9]:${1:-i} -q ; 
    echo $?; 
    i=$(($i+1)); 
done; 
+1

あなたは 'netstat'の第4列をチェックしていますよね? – fedorqui

+0

一般に、このアプローチは競争の激しいものです。アプリケーションを実際に試してみると、前のテストを行うよりも失敗したときに次のポートに移動する方がよい(割り当てられたポートのセットは、そのテストを実行するときと実際にソケットをバインドしようとするとき)。アプローチを組み合わせることはできますが、インクリメントとリトライに戻すべきです。 –

+0

申し訳ありません@CharlesDuffyしかし、私はそれがどういう意味かはっきりしていません。技術的に私がしたいことは、その範囲内で次に利用可能なポートを見つけることです。私はループを見つけ、1が提示されると、ループを終了し、見つかったポートを保存します。これは、一度に一人だけが使用するので、私はそれが実行されている複数のインスタンスについて心配していません.... – Kevin

答えて

1
for i in {11212..12655} 
do 
    netstat -ntpl | grep [0-9]:${1:-i} -q ; 
    echo $i:$? 
done 

正確に何が必要なの?

3

数字を比較する場合は、grepは正規表現を使用します。そして、範囲11211-12655の正規表現は、タイプするのにちょっと退屈になるでしょう。

代わりにawkを使用してはどうですか?

netstat -ntpl | awk 'split($4, a, ":")==2 && a[2]>=11211 && a[2]<=12655' 

これはnetstatの出力の4列を取得し、2 :区切られたスライスでそのコンテンツを分割します。次に、配列a[]のデータを再生し、一致させる範囲を定義します。

+0

私は探しているものを並べ替えていますが、 //prntscr.com/cippsr – Kevin

+0

@ Kevinあなたはコンセプトをミックスしています: 'a [1]'は 'awk'の変数です。 'echo $ A [0]'を実行すると、awkと何の関係もない変数をbashに表示します。 'netstat -ntpl |と同じように簡単なものがあるかもしれないので、あなたの望む出力が何であるかを示すあなたの質問を更新してください。 awk 'split($ 4、a、 ":")== 2 && a [2]> = 11211 && a [2] <= 12655 {print a [1]} 'は実行します。 – fedorqui

+0

結果で:http://prntscr.com/cipt03 – Kevin

関連する問題