Error de socket: la dirección ya está en uso

Tengo un script CherryPy que ejecuto con frecuencia para iniciar un servidor. Hoy tuve que iniciarlo y detenerlo varias veces para corregir algunos errores en un archivo de configuración, y creo que el zócalo no se cerró completamente porque cuando intenté iniciarlo de nuevo, tuve este problema:

[23/Mar/2015:14:08:00] ENGINE Listening for SIGHUP. [23/Mar/2015:14:08:00] ENGINE Listening for SIGTERM. [23/Mar/2015:14:08:00] ENGINE Listening for SIGUSR1. [23/Mar/2015:14:08:00] ENGINE Bus STARTING CherryPy Checker: The Application mounted at '' has an empty config. [23/Mar/2015:14:08:00] ENGINE Started monitor thread 'Autoreloader'. [23/Mar/2015:14:08:00] ENGINE Started monitor thread '_TimeoutMonitor'. [23/Mar/2015:14:08:00] ENGINE Error in HTTP server: shutting down Traceback (most recent call last): File "/home/andrew/virtualenvs/mikernels/lib/python2.7/site-packages/cherrypy/process/servers.py", line 188, in _start_http_thread self.httpserver.start() File "/home/andrew/virtualenvs/mikernels/lib/python2.7/site-packages/cherrypy/wsgiserver/wsgiserver2.py", line 1848, in start raise socket.error(msg) error: No socket could be created 

Edité wsgiserver2.py de CherryPy para ver los detalles de socket.error y error.strerror

 98 (98, 'Address already in use') Address already in use 

Mientras tanto mi zócalo se construye como:

 af = 2 socktype = 1 proto = 6 canonname = '' sa = ('0.0.0.0', 2112) self.bind(af, socktype, proto) 

(ese no es el código exacto, pero esos son los valores cuando se dispara el error)

Comprobé netstat y no vi nada escuchando en el puerto 2112, ¿qué podría estar causando el problema y cómo puedo diagnosticarlo?

¡Gracias!

Puedes probar lo siguiente

 from socket import * sock=socket() sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # then bind 

De los documentos:

La bandera SO_REUSEADDR le dice al kernel que reutilice un socket local en el estado TIME_WAIT, sin esperar a que expire su tiempo de espera natural.

Aquí está la explicación completa:

Ejecutar un ejemplo varias veces con un retraso demasiado pequeño entre las ejecuciones, podría llevar a este error:

socket.error: [Errno 98] Address already in use

Esto se debe a que la ejecución anterior dejó el socket en un estado TIME_WAIT y no se puede reutilizar inmediatamente.

Hay un indicador de socket para establecer, para evitar esto, socket.SO_REUSEADDR:

 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) 

Podrías encontrar el proceso y kill haciendo:

 ps aux | grep python 

, encontrando el ID de proceso, y parándolo manualmente haciendo:

 sudo kill -9 PID 

Reemplazo de PID con su PID.

A menudo tengo que hacer esto mientras hago pruebas con Flask / CherryPy. Estaría interesado en ver si hay una forma más fácil (por ejemplo, para prevenirlo en primer lugar)

Mucho más fácil de hacerlo por:

Comprueba el PID (: 5000 es el host desde que ejecuté 127.0.0.1:5000):
$ lsof -i :5000
Entonces mátalo:
$ sudo kill -9 PID