私はMac端末からPythonでサーバーを設定しようとしています。
私はフォルダの場所と用途に移動します。
python -m SimpleHTTPServer
しかし、これは私にエラーを与えます:
socket.error: [Errno 48] Address already in use
以前は自分のマシンの別の場所にある別のWebサイトに対して同じコマンドを使用して接続を開いていました。
デフォルトポート(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以上の任意の数字にすることができます。
簡単な解決策:
Port 8080
を使ってプロセスを見つけます。
Sudo lsof -i:8080
それを殺します:
kill XXXX
つかいます
Sudo lsof -i:5000
これにより、ポートを使用しているプロセスがあればそのリストが表示されます。プロセスのリストが表示されたら、PID列のidを使用してプロセスの使用を終了します
kill 379 #use the provided PID
ちなみに、これがそもそも起こらないようにするには、単に押すだけです。 Ctrl+C SimpleHTTPServerがまだ正常に動作している間に端末でこれはサーバを「適切に」停止してポートを解放するので、サーバを再起動する前にプロセスを見つけて強制終了する必要はありません。
(改造:私はそれが属するところで最も良い答えにこのコメントを載せようとしました、しかし私は十分な評判を持っていません。)
また、次に利用可能なポートで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アプローチほど信頼性がありません - プロセスが実行する前に別のプロセスがポートを取得する可能性があります - 独自の試行錯誤アプローチがあります。
私はPythonに慣れていませんが、私の簡単な調査の結果、これはソケットが束縛されている典型的なものであることがわかりました。ソケットがまだ使用されていて、使用するのを待つ必要があるかもしれません。または、単に追加することもできます。
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
これにより、ポートが短時間で使用可能になります。私の場合は、すぐに利用できるようになりました。
それを取り除くための簡単な一行コマンド、ターミナルで下記のコマンドを入力してください、
ps -a
これはすべてのプロセスを一覧表示し、Pythonで使用されているチェックアウトと端末でbellowコマンドを入力します。
kill -9 (processID)
たとえば、kill -9 33178
私はラズベリーパイを持っています、そして私は(Flaskを使って)pythonウェブサーバを使っています。私は上記のすべてを試してみました、唯一の解決策は端末を閉じ(Shell)そしてそれを再び開くことです。またはRaspberry Piを再起動します.
念のため上記の解決策がうまくいかなかった場合
プロセスが待機しているポートを取得します。
$ ps ax | grep python
プロセスを殺す
PROCESS_NAMEを強制終了