2013-09-28 5 views
117

Sto provando a configurare un server con python dal terminale mac.socket.error: [Errno 48] Indirizzo già in uso

naviga nella cartella luogo un utilizzo:

python -m SimpleHTTPServer 

Ma questo mi dà errore:

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

ho avuto in precedenza una connessione utilizzando lo stesso comando per un sito web diverso in un diverso posizione nella mia macchina.

+1

Elimina l'altro processo o esegui questo con una porta diversa: 'python -m SimpleHTTPServer 8081' – Blender

risposta

217

È già stato associato un processo alla porta predefinita (8000). Se hai già eseguito lo stesso modulo in precedenza, è molto probabile che il processo sia ancora associato alla porta. Cercare di individuare l'altro processo prima:

$ ps -fA | grep python 
    501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer 

Gli argomenti del comando sono inclusi, in modo da poter individuare quello che esegue SimpleHTTPServer se più di un python processo è attivo. Si consiglia di verificare se http://localhost:8000/ mostra ancora un elenco di directory per i file locali.

Il secondo numero è il numero del processo; arrestare il server per l'invio di un segnale:

kill 81651 

Questo invia un segnale standard SIGTERM; se il processo non risponde, potrebbe essere necessario ricorrere a metodi più difficili come inviare un segnale SIGKILL (kill -s KILL <pid> o kill -9 <pid>). Vedi Wikipedia for more details.

alternativa, eseguire il server su una porta diversa , specificando la porta alternativa sulla linea di comando:

$ python -m SimpleHTTPServer 8910 
Serving HTTP on 0.0.0.0 port 8910 ... 

quindi accedere al server come http://localhost:8910; dove 8910 può essere un qualsiasi numero da 1024 in su, a condizione che la porta non sia già stata presa.

+0

Che URL dovrei avere nel browser per vedere se funziona? Sto lavorando su una porta diversa come hai suggerito – irm

+0

@irm: 'http: // localhost: '. –

+5

potrebbe essere necessario utilizzare 'sudo kill -9 PID' – Danpe

5

Si può anche servire sulla porta facendo successivo più alto a disposizione qualcosa di simile in 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 

Se avete bisogno di fare la stessa cosa per gli altri programmi di utilità, può essere più conveniente come uno 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 

set che come un eseguibile con il nome get-free-port e si può fare qualcosa di simile:

someprogram --port=$(get-free-port) 

Non è affidabile come l'approccio nativo di Python perché lo script di bash non acquisisce la porta - un altro processo potrebbe afferrare la porta prima del processo (condizioni di competizione) - ma può essere ancora abbastanza utile quando si utilizza un'utilità questo non ha un approccio try-try-again a parte.

57

Soluzione semplice:

  1. trovare il processo che utilizza la porta 8080:

    sudo lsof -i:8080

  2. ucciderlo:

    kill XXXX

+0

Questa risposta trarrebbe beneficio da un esempio di come potrebbe apparire l'output 'lsof' e da come trovare l'ID del processo (il" XXXX "che si elenca) all'interno dell'output. Per chiunque vedendo questo senza quell'informazione, è il secondo campo nell'output, sotto un'etichetta di intestazione di "PID". – lindes

5

In ogni caso, per evitare che ciò accada in primo luogo, è sufficiente premere Ctrl + C nel terminale mentre SimpleHTTerver è ancora in esecuzione normalmente. Ciò "correttamente" interromperà il server e rilascerà la porta in modo da non dover trovare e interrompere nuovamente il processo prima di riavviare il server.

(Mod: ho provato a mettere questo commento sulla risposta migliore a cui appartiene, ma non ho abbastanza reputazione.)

6

Uso lsof -i: 5000 Questo vi darà un elenco di processi utilizzando la porta, se presente. Una volta che l'elenco dei processi è stato dato, usa l'id sulla colonna PID per terminare il processo: ad esempio kill 379