socket.error: [Errno 48] Naslov je že v uporabi

Poskušam vzpostaviti strežnik s pythonom iz terminala mac.

Navigiram se do lokacije mape in uporabim:

python -m SimpleHTTPServer

Toda to mi da napako:

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

Pred tem sem odprl povezavo z istim ukazom za drugo spletno stran na drugem mestu v mojem računalniku.

Rešitev

Na privzeta vrata (8000) je že vezan proces. Če ste že prej zagnali isti modul, je najverjetneje ta proces še vedno vezan na ta vrata. Najprej poskusite poiskati drugi proces:

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

Argumenti ukaza so vključeni, tako da lahko odkrijete tistega, ki izvaja SimpleHTTPServer, če je aktivnih več kot en proces python. Morda boste želeli preveriti, ali http://localhost:8000/ še vedno prikazuje seznam imenikov za lokalne datoteke.

Druga številka je številka procesa; zaustavite strežnik tako, da mu pošljete signal:

kill 81651

To pošlje standardni signal SIGTERM; če se proces ne odziva, boste morda morali namesto tega uporabiti strožje metode, kot je pošiljanje signala SIGKILL (kill -s KILL ali kill -9). Za več podrobnosti glej Wikipedija.

Strežnik lahko zaženete tudi na različnih vratih, tako da v ukazni vrstici navedete alternativna vrata:

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

nato dostopajte do strežnika kot http://localhost:8910; kjer je 8910 lahko katero koli število od 1024 naprej, če vrata še niso zasedena.

Komentarji (6)

Enostavna rešitev:

  1. Poiščite proces, ki uporablja vrata 8080:
`sudo lsof -i:8080`
  1. Ubijte ga:
XXXX` `kill XXXX`
Komentarji (4)

V Pythonu lahko uporabite tudi naslednja najvišja razpoložljiva vrata, če naredite nekaj podobnega:

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

Če morate enako narediti za druge pripomočke, bo morda bolj priročno uporabiti skripto 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

To nastavite kot izvršilni program z imenom get-free-port in lahko naredite nekaj takega:

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

To ni tako zanesljivo kot izvirni pristop Pythona, ker skripta bash ne zajame vrat - drug proces lahko zajame vrata pred vašim procesom (race condition) - vendar je lahko še vedno dovolj uporabno, če uporabljate orodje, ki nima lastnega pristopa try-try-again.

Komentarji (0)