Estoy intentando montar un servidor con python desde el terminal de mac.
Navego a la ubicación de la carpeta un uso:
python -m SimpleHTTPServer
Pero esto me da error:
socket.error: [Errno 48] Address already in use
Anteriormente había abierto una conexión usando el mismo comando para un sitio web diferente en una ubicación diferente en mi máquina.
Ya tiene un proceso vinculado al puerto por defecto (8000). Si ya ha ejecutado el mismo módulo antes, lo más probable es que ese proceso siga vinculado al puerto. Intente localizar el otro proceso primero:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Se incluyen los argumentos del comando, para que puedas localizar el que ejecuta SimpleHTTPServer
si hay más de un proceso python
activo. Puedes comprobar si http://localhost:8000/
sigue mostrando un listado de directorios para los archivos locales.
El segundo número es el número de proceso; detenga el servidor enviándole una señal:
kill 81651
Esto envía una señal estándar SIGTERM
; si el proceso no responde puede tener que recurrir a métodos más duros como enviar una señal SIGKILL
(kill -s KILL <pid>
o kill -9 <pid>
) en su lugar. Ver Wikipedia para más detalles.
Alternativamente, ejecute el servidor en un puerto diferente, especificando el puerto alternativo en la línea de comandos:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
entonces acceda al servidor como http://localhost:8910
; donde 8910
puede ser cualquier número de 1024 en adelante, siempre que el puerto no esté ya ocupado.
También puedes servir en el siguiente puerto disponible haciendo algo así 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 necesitas hacer lo mismo para otras utilidades, puede ser más conveniente como un 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
Configúralo como un ejecutable con el nombre get-free-port
y podrás hacer algo así:
someprogram --port=$(get-free-port)
Esto no es tan fiable como el enfoque nativo de Python porque el script de bash no captura el puerto - otro proceso podría tomar el puerto antes que tu proceso (condición de carrera) - pero aún así puede ser lo suficientemente útil cuando se utiliza una utilidad que no tiene un enfoque propio de intentar-volver a intentar.