Ik probeer een server op te zetten met python vanaf mac terminal.
Ik navigeer naar de map locatie en gebruik:
python -m SimpleHTTPServer
Maar dit geeft me een foutmelding:
socket.error: [Errno 48] Address already in use
Ik had eerder een verbinding geopend met hetzelfde commando voor een andere website op een andere locatie in mijn machine.
Je hebt al een proces gebonden aan de standaard poort (8000). Als je dezelfde module al eerder hebt gedraaid, is het zeer waarschijnlijk dat proces nog steeds gebonden aan de poort. Probeer eerst het andere proces te lokaliseren:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
De commando argumenten zijn bijgevoegd, zodat je degene die SimpleHTTPServer
draait kunt vinden als er meer dan een python
proces actief is. Je zou kunnen testen of http://localhost:8000/
nog steeds een directory lijst laat zien voor lokale bestanden.
Het tweede getal is het procesnummer; stop de server door hem een signaal te sturen:
kill 81651
Dit stuurt een standaard SIGTERM
signaal; als het proces niet reageert kan het zijn dat je je toevlucht moet nemen tot hardere methoden zoals het sturen van een SIGKILL
(kill -s KILL <pid>
of kill -9 <pid>
) signaal in plaats daarvan. Zie Wikipedia voor meer details.
Als alternatief, draai de server op een andere poort, door de alternatieve poort op te geven op de commandoregel:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
en benader de server dan als http://localhost:8910
; waarbij 8910
elk nummer vanaf 1024 kan zijn, mits de poort nog niet bezet is.
Je kunt ook serveren op de eerstvolgende beschikbare poort door iets als dit in Python te doen:
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
Als u hetzelfde moet doen voor andere utilities, kan het handiger zijn als een bash script:
#!/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
Stel dat in als een executable met de naam get-free-port
en je kunt iets als dit doen:
someprogram --port=$(get-free-port)
Dat is niet zo betrouwbaar als de oorspronkelijke Python aanpak omdat het bash script de poort niet vastlegt -- een ander proces zou de poort kunnen pakken voordat jouw proces dat doet (race condition) -- maar het kan nog steeds nuttig genoeg zijn als je een utility gebruikt die geen eigen try-try-again aanpak heeft.