2013-09-28 8 views
117

Próbuję skonfigurować serwer z pythonem z terminalu MAC.socket.error: [Errno 48] Adres już w użyciu

I przejdź do folderu lokalizacja jest zastosowanie:

python -m SimpleHTTPServer 

Ale to daje mi błąd:

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

miałem wcześniej otworzyć połączenia przy użyciu tego samego polecenia do innej strony w innym lokalizacja w mojej maszynie.

+1

zabić inny proces lub uruchomić ten jeden z innego portu: 'python -m SimpleHTTPServer 8081' – Blender

Odpowiedz

217

Masz już proces powiązany z domyślnym portem (8000). Jeśli wcześniej korzystałeś już z tego samego modułu, najprawdopodobniej proces nadal jest związany z portem. Spróbuj zlokalizować inny proces pierwszy:

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

Argumenty poleceń są włączone, więc można na miejscu jednego z systemem SimpleHTTPServer jeśli więcej niż jeden python proces jest aktywny. Możesz przetestować, czy http://localhost:8000/ nadal wyświetla listę katalogów dla plików lokalnych.

Druga liczba to numer procesu; zatrzymać serwer, wysyłając mu sygnał:

kill 81651 

Ten wysyła standardową SIGTERM sygnału; jeśli proces nie reaguje, być może trzeba użyć bardziej odpornych metod, takich jak wysyłanie sygnału SIGKILL (kill -s KILL <pid> lub). Zobacz Wikipedia for more details.

Ewentualnie uruchomić serwer na porcie inny, poprzez określenie alternatywnego portu w wierszu poleceń:

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

następnie uzyskać dostęp do serwera jako http://localhost:8910; gdzie 8910 może być dowolną liczbą od 1024 i wyższą, pod warunkiem, że port nie jest już zajęty.

+0

Co url powinienem mieć przeglądarkę, żeby sprawdzić, czy działa? Używam innego portu, co sugerowałeś – irm

+0

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

+5

może być konieczne użycie 'sudo kill -9 PID' – Danpe

5

Można również służyć na następnym najwyższy dostępny portu robi coś takiego w Pythonie:

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 

Jeśli trzeba zrobić to samo dla innych mediów, może to być wygodniejsze jako skrypt 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 że jako plik wykonywalny o nazwie get-free-port i można zrobić coś takiego:

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

To nie jest tak niezawodne, jak natywne podejście Pythona, ponieważ skrypt bash nie przechwytuje portu - inny proces może pobrać port przed procesem (stan wyścigu) - ale może być wystarczająco przydatny podczas korzystania z narzędzia który nie ma własnego podejścia try-try-again.

57

Proste rozwiązanie:

  1. Znajdź proces za pomocą portu 8080:

    sudo lsof -i:8080

  2. Zabij go:

    kill XXXX

+0

Ta odpowiedź skorzystałaby z przykładu, jak może wyglądać wyjście 'lsof' oraz jak znaleźć identyfikator procesu (" XXXX ", który można znaleźć) w danych wyjściowych. Dla każdego, kto widzi to bez tych informacji, jest to drugie pole na wyjściu pod etykietą nagłówka "PID". – lindes

5

Nawiasem mówiąc, aby temu zapobiec, wystarczy nacisnąć Ctrl + C w terminalu, podczas gdy SimpleHTTPServer nadal działa normalnie. Spowoduje to "właściwe" zatrzymanie serwera i zwolnienie portu, aby nie trzeba było ponownie znajdować i zabijać procesu przed ponownym uruchomieniem serwera.

(Mods: I nie starają się umieścić ten komentarz na najlepszą odpowiedź, gdzie należy, ale nie mam wystarczająco dużo reputacji.)

6

Zastosowanie lsof -i: 5000 To daje listę przetwarza za pomocą portu, jeśli istnieje. Gdy lista procesów jest podana, należy użyć identyfikatora na kolumnie PID w celu zakończenia procesu: np zabić 379

Powiązane problemy