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)

通过在客户环境中执行上面的操作,发现监听端口的是一个僵尸进程,将僵尸进程清除后问题消失。

comments powered by Disqus