Mac terminalden python ile bir sunucu kurmaya çalışıyorum.
Klasör konumuna gidiyorum ve kullanıyorum:
python -m SimpleHTTPServer
Ama bu bana hata veriyor:
socket.error: [Errno 48] Address already in use
Daha önce aynı komutu kullanarak bir bağlantı açmıştım makinemde farklı bir konumda farklı bir web sitesi için.
Zaten varsayılan bağlantı noktasına (8000) bağlı bir işleminiz var. Aynı modülü daha önce çalıştırdıysanız, büyük olasılıkla o işlem hala bağlantı noktasına bağlıdır. Önce diğer süreci bulmaya çalışın:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Komut argümanları dahil edilmiştir, böylece birden fazla python
işlemi etkinse SimpleHTTPServer
çalışanını tespit edebilirsiniz. http://localhost:8000/`un hala yerel dosyalar için bir dizin listesi gösterip göstermediğini test etmek isteyebilirsiniz.
İkinci numara işlem numarasıdır; sunucuya bir sinyal göndererek durdurun:
kill 81651
Bu standart bir SIGTERM
sinyali gönderir; eğer süreç yanıt vermiyorsa, bunun yerine SIGKILL
(kill -s KILL <pid>
veya kill -9 <pid>
) sinyali göndermek gibi daha sert yöntemlere başvurmanız gerekebilir. Daha fazla ayrıntı için bakınız Wikipedia.
Alternatif olarak, komut satırında alternatif bağlantı noktasını belirterek sunucuyu farklı bir bağlantı noktasında çalıştırın:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
ardından sunucuya http://localhost:8910
olarak erişin; burada 8910
, bağlantı noktasının zaten alınmamış olması koşuluyla 1024 ve üzeri herhangi bir sayı olabilir.
Python'da buna benzer bir şey yaparak bir sonraki en yüksek kullanılabilir bağlantı noktasında da hizmet verebilirsiniz:
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
Aynı şeyi diğer yardımcı programlar için yapmanız gerekiyorsa, bir bash betiği olarak daha kullanışlı olabilir:
#!/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
Bunu get-free-port
adıyla bir çalıştırılabilir olarak ayarlayın ve şöyle bir şey yapabilirsiniz:
someprogram --port=$(get-free-port)
Bu, yerel Python yaklaşımı kadar güvenilir değildir çünkü bash betiği bağlantı noktasını yakalamaz - başka bir işlem bağlantı noktasını sizin işleminizden önce yakalayabilir (yarış koşulu) - ancak yine de kendi başına bir dene-tekrar dene yaklaşımı olmayan bir yardımcı program kullanırken yeterince yararlı olabilir.