2016-09-16 96 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