我们的 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() 调用。
在这种情况下,您在第二次调用时会遇到“地址已被使用”的问题,但是由于您的程序随后崩溃,您无法看到打开的套接字。