Назад | Перейти на главную страницу

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 не знает? Каким-либо другим способом я могу узнать, что это за сокет?

Не уверен, была ли у меня такая же проблема, но я помещу то, что нашел здесь.

У меня был процесс сервера 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 ().