2016-09-16 63 views
1

我需要找出端口是否在特定的端口範圍內使用。Bash腳本獲取端口使用

我正在設置一個腳本來創建php-fpm池,並且希望確保我可以檢查未使用的下一個可用端口。

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

獲取我什麼,我需要看是否特定端口正在使用,但我怎麼能做到這一點的端口範圍?說... 11211 - 12655

我應該循環一個範圍,並停在「找到」下一個可用? 但是,這一切都讓我回到了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列和分裂的兩個: - 分隔片的內容。然後,您可以使用數組a[]中的數據來玩並定義您希望它匹配的範圍。

+0

排序我正在尋找,但這是什麼讓我:http: //kentscr.com/cippsr – Kevin

+0

@Kevin好吧,你在混合概念:'a [1]'是'awk'中的一個變量。當你echo $ A [0]時,你在bash中打印一個與awk沒有任何關係的變量。請更新你的問題,以顯示你想要的outpupt,因爲可能像'netstat -ntpl |'那樣簡單awk'split($ 4,a,「:」)== 2 && a [2]> = 11211 && a [2] <= 12655 {print a [1]}'會做。 – fedorqui

+0

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