netstat shows a listening port with no pid
问题#
今天在客户环境中遇到了端口被占用的情况。具体表现是:
netstat 命令显示端口被监听,但是在 “PID/Program name” 一列中显示为空。
用 lsof 命令查看显示该端口未被占用。
但是启动程序监听该端口时会失败,提示端口被占用。
解决#
通过在网上搜索到这个答案:https://serverfault.com/a/847910
简单来说,先通过 netstat 命令找到监听端口的 inode :
$ sudo netstat -ltpnae | awk 'NR==2 || /:8785/'
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp6 0 0 :::8785 :::* LISTEN 199179 212698803 -
tcp6 1 0 ::1:8785 ::1:45518 CLOSE_WAIT 0 0 -
然后再使用 lsof 命令找到这个 inode 关联在哪个进程:
$ sudo lsof | awk 'NR==1 || /212698803/'
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
envelope_ 145661 145766 drees 15u IPv6 212698803 0t0 TCP *:8785 (LISTEN)
通过在客户环境中执行上面的操作,发现监听端口的是一个僵尸进程,将僵尸进程清除后问题消失。