我正在尝试使用shell脚本检查端口是否可用并获取返回值。例如:如果端口8080可用,则返回true,否则返回false。有人可以帮忙吗?我已经尝试使用netstat
。
lsof
是你的好朋友:
# lsof -i:8080 # free on my machine
# echo $?
1
# lsof -i:5353 # occupied
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mDNSRespo 64 _mdnsresponder 8u IPv4 0x9853f646e2fecbb7 0t0 UDP *:mdns
mDNSRespo 64 _mdnsresponder 9u IPv6 0x9853f646e2fec9cf 0t0 UDP *:mdns
# echo $?
0
因此,在脚本中,您可以使用!
来否定值以测试可用性:
if ! lsof -i:8080
then
echo 8080 is free
else
echo 8080 is occupied
fi
function is_port_free {
netstat -ntpl | grep [0-9]:${1:-8080} -q ;
if [ $? -eq 1 ]
then
echo yes
else
echo no
fi
}
例如:
$ is_port_free 8080
yes
$ is_port_free 22
no
netstat -an|egrep '[0-9]:8080 .+LISTENING'
lsof
的输出重定向到/dev/null
,使其更具“脚本化”。 - ivantgrep
查找LISTEN
会很有用。类似这样的语句if ! lsof -i:8080 | grep LISTEN > /dev/null
。如果您既有一个本地运行的服务器,又有一个外部连接,那么这可能非常有用。例如,您连接到远程 MySQL 服务器,同时还有一个本地 MySQL 服务器在运行。外部连接将显示为ESTABLISHED
。如果您只想知道是否有正在使用的本地端口,则需要过滤掉这些连接。 - wsamslsof -i:8080 -sTCP:LISTEN > /dev/null
来代替使用grep
进行过滤。 - gentooboontoo