2013-09-28 17 views
117

私は、mac端末からpythonでサーバを設定しようとしています。socket.error:[Errno 48]アドレスは既に使用中です

私は、使用場所をフォルダに移動:

python -m SimpleHTTPServer 

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

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

私は以前に別の異なるウェブサイトのために同じコマンド を使用して接続をオープンしました私のマシンの場所。

+1

他のプロセスをkillするか、別のポートで実行します: 'python -m SimpleHTTPServer 8081' – Blender

答えて

217

すでにプロセスがデフォルトのポート(8000)にバインドされています。以前に同じモジュールを実行していた場合、プロセスはまだポートにバインドされている可能性があります。最初に他のプロセスを試してみて、見つける:複数のpythonプロセスがアクティブである場合は、SimpleHTTPServerを実行しているものを見つけることができるように

$ ps -fA | grep python 
    501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer 

コマンドの引数は、含まれています。 http://localhost:8000/にローカルファイルのディレクトリ一覧がまだ表示されているかどうかをテストしたい場合があります。

2番目の番号はプロセス番号です。それに信号を送信することで、サーバを停止します。

kill 81651 

これは標準SIGTERM信号を送信します。プロセスが応答しない場合は、代わりにSIGKILLkill -s KILL <pid>またはkill -9 <pid>)シグナルを送信するなど、より厳しい方法に頼らざるを得ない可能性があります。 Wikipedia for more detailsを参照してください。あるいは

、コマンドライン上の別のポートを指定することによって、異なるポート上のサーバーを実行します

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

は次にhttp://localhost:8910としてサーバにアクセスします。 8910は1024以上の任意の番号で指定できますが、ポートがまだ使用されていない場合に限ります。

+0

どのようなURL私はブラウザでそれが動作しているかどうかを確認する必要がありますか? 'http:// localhost:'のように、別のポートで実行しています( – irm

+0

)。 –

+5

は 'sudo kill -9 PID'を使う必要があります。 – Danpe

5

また、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の手法ほど信頼性がありません。プロセスが競合する前に別のプロセスがポートを取得する可能性がありますが、それはそれ自身のtry-try-againアプローチを持っていません。

57

シンプルなソリューション:

  1. ポート8080を使用してプロセスを探す:

    sudo lsof -i:8080

  2. それを殺す:

    kill XXXX

+0

この答えは 'lsof'出力の例と、出力内のプロセスID(あなたがリストした" XXXX ")を見つける方法の恩恵を受けるでしょう。その情報なしでこれを見る人にとって、それは "PID"のヘッダーラベルの下に出力の2番目のフィールドです。 – lindes

5

ところで、これが最初に起きないようにするには、SimpleHTTPServerがまだ正常に動作している間に、Ctrl + Cを端末に入力するだけです。これにより、サーバーを「正常に」停止してポートを解放するため、サーバーを再起動する前にプロセスを再度検出して終了する必要はありません。

(改造:。私はそれが属する最良の答えにこのコメントを入れてみてくださいでしたが、私は十分な評判を持っていない)

6

利用-iのlsof:5000 これは、あなたのリストが表示されますポートを使用している場合は処理します。 プロセスのリストが与えられたら、PIDカラムのidを使ってプロセスを終了します:kill 379

関連する問題