回答:
既にデフォルトのポート(8000)にバインドされているプロセスがあります。以前に同じモジュールをすでに実行している場合は、そのプロセスがまだポートにバインドされている可能性があります。最初に他のプロセスを試してみてください:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
コマンド引数が含まれているためSimpleHTTPServer
、複数のpython
プロセスがアクティブな場合に実行中のものを見つけることができます。http://localhost:8000/
ローカルファイルのディレクトリリストがまだ表示されるかどうかをテストすることもできます。
2番目の番号はプロセス番号です。シグナルを送信してサーバーを停止します。
kill 81651
これは標準SIGTERM
信号を送信します。プロセスが応答しない場合は、代わりにSIGKILL
(kill -s KILL <pid>
またはkill -9 <pid>
)シグナルを送信するなど、より厳しい方法に頼らなければならない場合があります。詳細については、ウィキペディアを参照してください。
また、サーバーを実行して別のコマンドラインで代替ポートを指定することで、ポート:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
その後、サーバーにアクセスしますhttp://localhost:8910
。ここで8910
、ポートはまだ使用されていませんが、1024以上の任意の番号を指定できます。
sudo kill -9 PID
kill
プロセスにシグナルを送信し、それを処理することを決定できます(正常にシャットダウンするか、ログファイルをローテーションするなど)。これらの信号は、整数(名前の各)、デフォルトは15であること、を意味しているTERM
か、終了します。-9を使用するKILL
と、プロセスがキャッチおよび無視できないシグナル9を送信します。OSは、プロセスの好みに関係なくプロセスを終了します。
簡単な解決策:
ポートを使用してプロセスを検索します8080
。
sudo lsof -i:8080
それを殺します:
kill XXXX
lsof
出力がどのように見えるかの例と、出力内のプロセスID(リストした「XXXX」)を見つける方法から利益を得るでしょう。その情報なしでこれを見る人にとっては、「PID」のヘッダーラベルの下の出力の2番目のフィールドです。
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
他のユーティリティで同じことを行う必要がある場合は、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
名前を付けて実行可能ファイルとして設定すると、get-free-port
次のようになります。
someprogram --port=$(get-free-port)
bashスクリプトはポートをキャプチャしないため、ネイティブPythonのアプローチほど信頼性が高くありません-プロセスが実行する前に別のプロセスがポートを取得する可能性があります(競合状態)-が、独自の再試行アプローチがあります。
上記の解決策が機能しなかった場合に備えて:
プロセスがリッスンしているポートを取得します。
$ ps ax | grep python
プロセスを強制終了
$殺害PROCESS_NAME
サーバーでを使用してアドレスを再利用することを許可できますallow_reuse_address
。
サーバーがアドレスの再利用を許可するかどうか。これはデフォルトで
False
になり、サブクラスで設定してポリシーを変更できます。
import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()
python -m SimpleHTTPServer 8081