python 报告套接字正在使用,而 netstat 和其他人声称没有

python 报告套接字正在使用,而 netstat 和其他人声称没有

我们的 RHES3 盒子出现了一个奇怪的套接字问题:

Python 2.4.1 (#1, Jul  5 2005, 19:17:11)
[GCC 3.2.3 20030502 (Red Hat Linux 3.2.3-52)]
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket()
>>> s.bind(('localhost',12351))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 1, in bind
socket.error: (98, 'Address already in use')

这看起来很正常,让我们看看这个插座有什么:

# netstat -untap | grep 12351

{无输出}

# grep 12351 /proc/net/tcp

{无输出}

# lsof | grep 12351

{无输出}

# fuser -n tcp 12351

{无输出,重复 python 测试再次失败}

# nc localhost 12351

{无输出}

# nmap localhost 12351

{显示端口已关闭}

其他高端口工作正常(例如 12352 工作)

这个端口有什么神奇之处吗?我还能从其他地方查看吗?python 在哪里可以找到 netstat 不知道的正在使用的套接字?还有其他方法可以找出该套接字是什么或是否是吗?

答案1

不确定我是否遇到了同样的问题,但我会将我发现的问题放在这里。

我有一个绑定到 8081 的 python 服务器进程,并且使用反向代理模块将 Apache 代理到它。

查看 ps 发现该进程正在运行:

UID    PID  PPID  C STIME TTY          TIME CMD
xxxx 31896 31681  2 08:51 ?        00:00:03  \_ python /opt/xxxx/install/xxxx/xxxx/bin/content_server.py localhost:8081

Telnet 运行良好:

$ telnet localhost 8081
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

但是在 netstat 中搜索端口号并没有显示任何绑定到该端口的内容:

$ netstat -a | grep 8081
$

但是如果你检查 netstat 中的进程 ID,你可能会看到这样的一行,其中“tproxy”作为端口号:

$ netstat -a -p | grep 31896
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp        0      0 MELLAGFIN01:tproxy  *:*  LISTEN  31896/python

其他人可能可以确认,但我假设这是一种内核级 tcp 代理?

答案2

如果其他东西可以绑定该套接字,则在两者上运行 strace 并查看 bind() 之前的系统调用是否不同。

答案3

我认为您的脚本可能执行了多个 socket.bind() 调用。

在这种情况下,您在第二次调用时会遇到“地址已被使用”的问题,但是由于您的程序随后崩溃,您无法看到打开的套接字。

相关内容