Jeg prøver å sette opp en server med python fra mac-terminal.
Jeg navigerer til mappeplassering og bruk:
python -m SimpleHTTPServer
Men dette gir meg feil:
socket.error: [Errno 48] Address already in use
Jeg hadde tidligere åpnet en tilkobling ved hjelp av samme kommando for et annet nettsted på et annet sted på maskinen min.
Du har allerede en prosess knyttet til standardporten (8000). Hvis du allerede har kjørt den samme modulen før, er det mest sannsynlig at prosessen fortsatt er bundet til porten. Prøv å finne den andre prosessen først:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Kommandoargumentene er inkludert, slik at du kan finne den som kjører SimpleHTTPServer
hvis mer enn en python
-prosess er aktiv. Det kan være lurt å teste om http://localhost:8000/
fortsatt viser en katalogliste for lokale filer.
Det andre tallet er prosessnummeret; stopp serveren ved å sende den et signal:
kill 81651
Dette sender et standard SIGTERM
-signal; hvis prosessen ikke svarer, må du kanskje ty til tøffere metoder som å sende et SIGKILL
-signal (kill -s KILL <pid>
eller kill -9 <pid>
) i stedet. Se Wikipedia for mer informasjon.
Alternativt kan du kjøre serveren på en annen port ved å angi den alternative porten på kommandolinjen:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
og deretter få tilgang til serveren som http://localhost:8910
; der 8910
kan være et hvilket som helst tall fra 1024 og oppover, forutsatt at porten ikke allerede er opptatt.
Du kan også tjene på den nest høyeste tilgjengelige porten som gjør noe lignende i 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
Hvis du trenger å gjøre det samme for andre verktøy, kan det være mer praktisk som et bash-skript:
#!/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
Sett det opp som en kjørbar fil med navnet get-free-port
og du kan gjøre noe som dette:
someprogram --port=$(get-free-port)
Det er ikke så pålitelig som den opprinnelige Python-tilnærmingen fordi bash-skriptet ikke fanger porten - en annen prosess kan ta tak i porten før prosessen din gjør det (rasebetingelse) - men kan fortsatt være nyttig nok når du bruker et verktøy som ikke har en egen try-try-again-tilnærming.