python informa soquete em uso, netstat e outros afirmam que não

3

Temos um problema de soquete estranho com uma caixa 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')

Isso parece normal, vamos ver o que tem esse soquete:

# netstat -untap | grep 12351

{sem saída}

# grep 12351 /proc/net/tcp

{sem saída}

# lsof | grep 12351

{sem saída}

# fuser -n tcp 12351

{sem saída, a repetição do teste python falha novamente}

# nc localhost 12351

{sem saída}

# nmap localhost 12351

{mostra a porta fechada}

Outras portas altas funcionam bem (por exemplo, 12352 obras)

Existe algo de mágico nessa porta? Existe algum outro lugar que eu possa olhar? Onde python descobrir que o soquete está em uso que netstat não conhece? Qualquer outra maneira eu posso descobrir o que / se esse socket é?

    
por captainmish 24.02.2012 / 15:13

3 respostas

1

Não tenho certeza se tive o mesmo problema, mas vou colocar o que encontrei aqui.

Eu tinha um processo do servidor python que estava vinculado ao 8081 e o Apache usando o proxy proxy reverso.

Examinar em ps mostrou que o processo estava em execução:

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 funcionou bem:

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

No entanto, o greping para o número da porta no netstat não mostrou nada vinculado a essa porta:

$ netstat -a | grep 8081
$

No entanto, se você verificar o id do processo no netstat, poderá ver uma linha como esta com "tproxy" como o número da porta:

$ 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

Alguém provavelmente pode confirmar, mas estou supondo que isso seja algum tipo de proxy tcp no nível do kernel?

    
por 19.09.2012 / 01:07
0

Se algo mais puder ligar esse socket, execute strace em ambos e veja se o sistema chama antes que o bind () seja diferente.

    
por 07.07.2012 / 10:20
0

Eu acho que é possível que seu script faça várias chamadas de socket.bind ().

Nesse caso, você tem o problema 'endereço já em uso' na segunda chamada, mas como o programa falha logo depois disso, você não consegue ver o soquete aberto.

    
por 09.08.2013 / 14:33