У нас есть странная проблема с сокетом с коробкой 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 не знает? Каким-либо другим способом я могу узнать, что это за сокет?
Не уверен, была ли у меня такая же проблема, но я помещу то, что нашел здесь.
У меня был процесс сервера python, который был привязан к 8081, и 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, вы можете увидеть такую строку с «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-прокси уровня ядра?
Я думаю, что возможно, что ваш скрипт выполняет несколько вызовов socket.bind ().
В этом случае у вас есть проблема «адрес уже используется» при втором вызове, но поскольку ваша программа вылетает сразу после этого, вы не можете видеть открытый сокет.
Если что-то еще может связать этот сокет, запустите strace на обоих и посмотрите, отличаются ли системные вызовы перед bind ().