socket.error:[Errno 48]アドレスはすでに使用されています


224

Mac端末からPythonでサーバーをセットアップしようとしています。

私はフォルダの場所に移動して使用します:

python -m SimpleHTTPServer

しかし、これは私にエラーを与えます:

socket.error: [Errno 48] Address already in use

以前、マシンの別の場所にある別のWebサイトに対して同じコマンドを使用して接続を開いていました。


2
他のプロセスを強制終了したり、別のポートで、このいずれかを実行しますpython -m SimpleHTTPServer 8081
ブレンダー

回答:


356

既にデフォルトのポート(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信号を送信します。プロセスが応答しない場合は、代わりにSIGKILLkill -s KILL <pid>またはkill -9 <pid>)シグナルを送信するなど、より厳しい方法に頼らなければならない場合があります。詳細については、ウィキペディアを参照してください

また、サーバーを実行して別のコマンドラインで代替ポートを指定することで、ポート:

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

その後、サーバーにアクセスしますhttp://localhost:8910。ここで8910、ポートはまだ使用されていませんが、1024以上の任意の番号を指定できます。


それが機能しているかどうかを確認するために、ブラウザにどのURLが必要ですか?あなたがサジェストしたように私は別のポートで実行しています
irm

14
使用する必要があるかもしれないsudo kill -9 PID
Danpe

おかげで、@ Danpe、機能しなかった「sudo kill PID」を試しましたが、「sudo kill -9 PID」はプロセスを強制終了しました。-9の指定を知っている人はいますか?sudoのマニュアルでさえ、このパラメーターをカバーしていないようですsudo.ws/man/sudo.man.html
seokhoonlee

3
@seokhoonlee:killプロセスにシグナルを送信し、それを処理することを決定できます(正常にシャットダウンするか、ログファイルをローテーションするなど)。これらの信号は、整数(名前の各)、デフォルトは15であること、を意味しているTERMか、終了します。-9を使用するKILLと、プロセスキャッチおよび無視できないシグナル9を送信します。OSは、プロセスの好みに関係なくプロセスを終了します。
Martijn Pieters

@seokhoonlee:ウィキペディアのUnixシグナルの記事もご覧ください。
Martijn Pieters

153

簡単な解決策:

  1. ポートを使用してプロセスを検索します8080

    sudo lsof -i:8080

  2. それを殺します:

    kill XXXX


8
この答えは、lsof出力がどのように見えるかの例と、出力内のプロセスID(リストした「XXXX」)を見つける方法から利益を得るでしょう。その情報なしでこれを見る人にとっては、「PID」のヘッダーラベルの下の出力の2番目のフィールドです。
lindes 2018

2
@lindesあなたは亀裂です!
カルロスロドリゲス

@CarlosRodríguez:ハァッ?私はあなたがそのコメントで何を意味するのか本当にわかりません(「亀裂」の複数の定義を知っています、そして私が知っているものは適合しないようです...)
lindes

2
@CarlosRodríguez私は彼があなたの応答を完全にきちんと見つけたと信じたいです。lsofの出力のサンプルを提供する必要性とPIDを識別する方法についてのあなたの観察は非常に重要だと思います。返される各行の2番目の項目は通常PIDであり、常に出力のPID列の下にあります
Kudehinbu Oluwaponle

32

使用する

 sudo lsof -i:5000

これにより、ポートを使用しているプロセスがあれば、そのリストが表示されます。プロセスのリストが表示されたら、PID列のIDを使用してプロセスの使用を終了します

 kill 379 #use the provided PID

これは完璧です。特にMAC OSXで作業していて、SO_REUSEADDRの代わりにSO_REUSEPORTを
snr

16

ちなみに、これが最初から起こらないようにするには、SimpleHTTPServerが正常に動作している間にターミナルでCtrl+ Cを押すだけです。これにより、サーバーが「適切に」停止してポートが解放されるため、サーバーを再起動する前にプロセスを見つけて強制終了する必要がなくなります。

(変更点:私はこのコメントを、それが属する最良の回答に付けようとしましたが、十分な評判がありません。)


12

それを取り除くための単純な1行のコマンド、ターミナルで以下のコマンドを入力し、

ps -a

これにより、すべてのプロセスが一覧表示され、Pythonで使用されているチェックアウトとターミナルで次のコマンドが入力されます。

kill -9 (processID) 

たとえば、-9を殺す33178


7

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のアプローチほど信頼性が高くありません-プロセスが実行する前に別のプロセスがポートを取得する可能性があります(競合状態)-が、独自の再試行アプローチがあります。


6

私はPythonを初めて使用しましたが、簡単な調査の結果、これがバインドされているソケットの典型であることがわかりました。たまたまソケットがまだ使用されており、使用するまで待たなければならない場合があります。または、次のように追加することもできます。

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

これにより、ポートがより短時間で使用可能になります。私の場合、それはほとんどすぐにポートを利用可能にしました。


4

上記の解決策が機能しなかった場合に備えて:

  1. プロセスがリッスンしているポートを取得します。

    $ ps ax | grep python

  2. プロセスを強制終了

    $殺害PROCESS_NAME


3

私はラズベリーpiを持っており、(Flaskを使用して)Python Webサーバーを使用しています。私は上記のすべてを試しましたが、唯一の解決策はターミナル(シェル)を閉じて再度開くことです。または、ラズベリーpiを再起動します。何もそのWebサーバーを停止しません...


2

サーバーでを使用してアドレスを再利用することを許可できます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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.