如何找到哪个进程绑定套接字但不侦听?



>当我使用 nc 侦听端口时,它会显示

nc -l -vv -p 21000
retrying local 0.0.0.0:21000 : Address already in use Can't grab 0.0.0.0:21000 with bind

但是我找不到哪个任务使用工具netstat/ss占用此端口

netstat -an|grep 21000 

;什么也找不到

ss -a|grep 21000 

;什么也找不到

这个端口被我的java程序占用了,代码是:

public class Test1 {
public static void main(String[] args) throws InterruptedException {
Socket s = new Socket();
try {
s.bind(new InetSocketAddress("127.0.0.1",21000));
} catch (IOException e) {
e.printStackTrace();
}
Thread.sleep(500000000000L);
}
}

当我绑定套接字时,但不使用它与连接或侦听。 我进入/proc/[java 任务 id]/fd ,发现这个套接字的 inode 是"socket:[3073501]" 但我即使在/proc/net/tcp 或/proc/net/tcp6 中也找不到索引节点或端口

有什么方法可以找到绑定套接字但不侦听或连接的进程。

谢谢。

我看到 linux 3.10.0-327 源代码。我认为文件/proc/net/tcp 的内容来自 net/ipv4/tcp_ipv4.c。

在tcp_proc_register方法中,

static void *tcp_get_idx(struct seq_file *seq, loff_t pos)      
{
void *rc;
struct tcp_iter_state *st = seq->private;
st->state = TCP_SEQ_STATE_LISTENING;
rc        = listening_get_idx(seq, &pos);
if (!rc) {
st->state = TCP_SEQ_STATE_ESTABLISHED;
rc        = established_get_idx(seq, pos);
}
return rc;
}

它只显示袜子在听或从tcp_hashinfo建立。但是tcp_hashinfo有三个结构

struct inet_bind_hashbucket     *bhash; 
struct inet_listen_hashbucket   listening_hash[INET_LHTABLE_SIZE];
struct inet_ehash_bucket        *ehash;

bhash 可用于绑定。 但不在/proc/net/tcp 中导出。

我在Ubuntu下测试了你的Java程序。

如何找到绑定套接字但不侦听或连接的进程:

索夫

lsof | grep "can't identify protocol"

你会得到一个结果,比如:

COMMAND     PID   TID       USER   FD      TYPE             DEVICE SIZE/OFF    NODE NAME
java      29644 29653    stephan   12u     sock                0,7      0t0  312066 can't identify protocol

请注意"键入sock"和"名称"can't identify protocol

这是如何工作的?看看 lsof 的常见问题解答:

为什么基于/proc 的 lsof 报告某些套接字文件"无法识别协议"?

/基于 proc 的 LSOF 可能报告:

COMMAND PID ... TYPE ... NODE NAME
pump    226 ... sock ...  309 can't identify protocol

这意味着它无法识别协议(即AF_* 指定(由打开的套接字文件使用。 Lsof 标识 协议通过匹配与/proc//fd 条目到在选定文件中找到的节点编号/proc/net 子目录。

您可能无法找到所需的节点号,因为并非所有节点编号 内核协议模块完全支持/proc/net 信息。

验证流程

lsof 输出中的 PID 为 29644。

ls -l /proc/29644/fd   

这导致:

...
lrwx------ 1 stephan stephan 64 Jul  7 22:52 11 -> socket:[312064]
lrwx------ 1 stephan stephan 64 Jul  7 22:52 12 -> socket:[312066]
...

grep 312066 /proc/net/*

给出一个空的结果。

最新更新