python - starting - socket error:[ errno 98 address already in use
socket.error:[Errno 48] Dirección ya en uso (6)
Por cierto, para evitar que esto suceda en primer lugar, simplemente presione Ctrl + C en la terminal mientras SimpleHTTPServer sigue funcionando normalmente. Esto detendrá "correctamente" el servidor y liberará el puerto para que no tenga que buscar y eliminar el proceso nuevamente antes de reiniciar el servidor.
(Mods: Intenté poner este comentario sobre la mejor respuesta donde pertenece, pero no tengo suficiente reputación).
Estoy intentando configurar un servidor con python desde el terminal mac.
Navego a la ubicación de la carpeta y uso:
python -m SimpleHTTPServer
Pero esto me da error:
socket.error: [Errno 48] Address already in use
Previamente había abierto una conexión usando el mismo comando para un sitio web diferente en una ubicación diferente en mi máquina.
Solución simple:
Encuentre el proceso usando el puerto
8080
:sudo lsof -i:8080
Mátalo:
kill XXXX
Soy nuevo en Python, pero después de mi breve investigación, descubrí que esto es típico de que los enchufes estén enlazados. Sucede que el socket aún se está utilizando y es posible que deba esperar para usarlo. O bien, solo puede agregar:
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Esto debería hacer que el puerto esté disponible en un tiempo más corto. En mi caso, hizo que el puerto estuviera disponible casi de inmediato.
También puede servir en el siguiente puerto disponible más alto haciendo algo como esto en Python:
import SimpleHTTPServer
import SocketServer
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
port = 8000
while True:
try:
httpd = SocketServer.TCPServer(('''', port), Handler)
print ''Serving on port'', port
httpd.serve_forever()
except SocketServer.socket.error as exc:
if exc.args[0] != 48:
raise
print ''Port'', port, ''already in use''
port += 1
else:
break
Si necesita hacer lo mismo para otras utilidades, puede ser más conveniente como script bash:
#!/usr/bin/env bash
MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}
(netstat -atn | awk ''{printf "%s/n%s/n", $4, $4}'' | grep -oE ''[0-9]*$''; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1
Configura eso como un ejecutable con el nombre get-free-port
y puedes hacer algo como esto:
someprogram --port=$(get-free-port)
Eso no es tan confiable como el enfoque nativo de Python porque el script bash no captura el puerto; otro proceso podría atrapar el puerto antes de que lo haga tu proceso (condición de carrera), pero aún puede ser lo suficientemente útil al usar una utilidad que no funciona. Tiene un enfoque propio de intentarlo de nuevo.
Use lsof -i: 5000 Esto le dará una lista de procesos usando el puerto, si corresponde. Una vez que se da la lista de procesos, use el ID en la columna PID para finalizar el proceso: por ejemplo, matar a 379
Ya tiene un proceso vinculado al puerto predeterminado (8000). Si ya ejecutó el mismo módulo anteriormente, lo más probable es que el proceso siga vinculado al puerto. Intenta localizar el otro proceso primero:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Los argumentos del comando están incluidos, por lo que puede detectar el que está ejecutando SimpleHTTPServer
si hay más de un proceso de python
activo. Es posible que desee probar si http://localhost:8000/
todavía muestra una lista de directorios para archivos locales.
El segundo número es el número del proceso; detener el servidor enviándole una señal:
kill 81651
Esto envía una señal SIGTERM
estándar; si el proceso no responde, puede que tenga que recurrir a métodos más difíciles como enviar una señal SIGKILL
( kill -s KILL <pid>
o kill -9 <pid>
). Ver Wikipedia para más detalles .
Alternativamente, ejecute el servidor en un puerto diferente , especificando el puerto alternativo en la línea de comando:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
luego acceda al servidor como http://localhost:8910
; donde 8910
puede ser cualquier número desde 1024 en adelante, siempre que el puerto no esté ocupado.