2013-09-28 15 views
117

Ich versuche, einen Server mit Python von Mac-Terminal einzurichten.socket.error: [Errno 48] Adresse bereits verwendet

ich navigieren Lage in Ordner eine Verwendung:

python -m SimpleHTTPServer 

Aber das gibt mir eine Fehlermeldung:

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

Ich hatte vorher eine Verbindung öffnen den gleichen Befehl für eine andere Website in einer anderen mit Standort in meiner Maschine.

+1

Tötet den anderen Prozess töten oder diese mit einem anderen Port laufen: 'python -m Simple 8081' – Blender

Antwort

217

Sie haben bereits einen Prozess an den Standardport (8000) gebunden. Wenn Sie das gleiche Modul bereits zuvor ausgeführt haben, ist der Prozess wahrscheinlich immer noch an den Port gebunden. Versuchen Sie, und den anderen Prozess orten zuerst:

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

Die Befehlsargumente sind bereits enthalten, so dass Sie das ein SimpleHTTPServer laufen beschmutzen können, wenn mehr als ein python Prozess aktiv ist. Möglicherweise möchten Sie testen, ob http://localhost:8000/ weiterhin eine Verzeichnisliste für lokale Dateien anzeigt.

Die zweite Nummer ist die Prozessnummer; stoppen den Server, indem er ein Signal zu senden:

kill 81651 

Dies sendet ein Standard SIGTERM Signal; Wenn der Prozess nicht reagiert, müssen Sie möglicherweise auf härtere Methoden zurückgreifen, wie zum Beispiel das Senden eines SIGKILL (kill -s KILL <pid> oder kill -9 <pid>) Signals. Siehe Wikipedia for more details.

Alternativ laufen die Server auf einem verschiedenen Port, durch den alternativen Port in der Befehlszeile spezifiziert wird:

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

dann Zugriff auf den Server als http://localhost:8910; Dabei kann 8910 eine beliebige Zahl von 1024 und höher sein, sofern der Port nicht bereits vergeben ist.

+0

Was url sollte ich im Browser haben, um zu sehen, ob es funktioniert? Ich laufe auf einem anderen Port, wie Sie – irm

+0

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

+5

Möglicherweise müssen 'sudo kill -9 PID' – Danpe

5

Sie können auch auf der nächsthöheren verfügbaren Port etwas zu tun, wie dies in Python dienen:

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 

Wenn Sie das gleiche für andere Dienstprogramme tun müssen, es als ein Bash-Skript bequemer sein kann :

#!/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, dass get-free-port mit dem Namen als ausführbare Datei und Sie können etwas tun:

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

Das ist nicht so zuverlässig wie der native Python-Ansatz ist, weil der Bash-Skript den Hafen nicht erfassen - ein anderer Prozess könnte den Port greifen, bevor Ihr Prozess funktioniert (Race Condition) - aber immer noch nützlich genug sein kann, wenn ein Dienstprogramm dass nicht über eine Try-versuchen-wieder eigene Herangehensweise.

57

Einfache Lösung:

  1. Finden Sie den Prozess Port 8080:

    sudo lsof -i:8080

  2. töten es:

    kill XXXX

+0

Diese Antwort würde von einem Beispiel profitieren, wie die 'lsof'-Ausgabe aussehen könnte und wie Sie die Prozess-ID (die "XXXX", die Sie auflisten) in der Ausgabe finden. Für jeden, der dies ohne diese Informationen sieht, ist es das zweite Feld in der Ausgabe, unter der Überschrift "PID". – lindes

5

Übrigens, um dies zu verhindern, drücken Sie einfach Ctrl + C im Terminal, während SimpleHTTPServer noch normal läuft. Dies wird den Server "ordnungsgemäß" stoppen und den Port freigeben, so dass Sie den Prozess nicht erneut finden und beenden müssen, bevor Sie den Server neu starten.

(Mods: Ich habe versucht diesen Kommentar über die beste Antwort zu setzen, wo es hingehört, aber ich habe nicht genug Ruf.)

6

Verwenden lsof -i: 5000 Dies wird Ihnen eine Liste von Prozesse, die den Port verwenden, falls vorhanden. Sobald die Liste der Prozesse gegeben, die ID auf der PID-Spalte verwenden, um den Prozess zu beenden: zB 379