1. ホーム
  2. python

[解決済み] Flaskアプリを実行しようとすると、"Address already in use "と表示される。

2022-01-28 15:06:14

質問

最近アプリをアップデートし、実行しようとしたところ、"Address already in use"というエラーが表示されました。 これは何を意味し、どのように修正すればよいのでしょうか?

Traceback (most recent call last):
  File "/home/ubuntu/workspace/app.py", line 11, in <module>
    app.run(host = os.getenv('IP', '0.0.0.0'), port=int(os.getenv('PORT',8080)))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 687, in run_simple
    inner()
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 653, in inner
    fd=fd).serve_forever()
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 557, in make_server
    passthrough_errors, ssl_context, fd=fd)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 467, in __init__
    HTTPServer.__init__(self, (host, int(port)), handler)
  File "/usr/lib/python2.7/SocketServer.py", line 419, in __init__
    self.server_bind()
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/usr/lib/python2.7/SocketServer.py", line 430, in server_bind
    self.socket.bind(self.server_address)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

解決方法は?

そのポートを使っている他のサービスがあるということです( 8080 この場合) おそらく他のFlaskアプリを終了させるのを忘れていて 8080 ポートに接続します。

しかし、使用しているポートを変更する、例えば、次のように変更することができます。 4444 このように

if __name__=="__main__":
    app.run(host=os.getenv('IP', '0.0.0.0'), 
            port=int(os.getenv('PORT', 4444)))

でも、とにかく、自分のプログラムでなければ、どのプログラムがその部分を使っているのか知りたいのではないでしょうか。そのためには nmap または netcat GNU プログラムで確認する。

ここでは、その netcat 方法 ( ここから ):

$ sudo netstat -nlp | grep 8080
tcp  0  0  0.0.0.0:8080  0.0.0.0:*  LISTEN  125004/nginx

それを手に入れたら、手動で停止させることをお勧めします。 nginx などの HTTP サーバーは service コマンドまたは systemctl systemd Linux を使っている場合)

また、コマンドで強制終了することもできます。 kill :

kill <pid>

を経由して殺すこともできます。 killall または pkill の場合、pidの代わりにプロセス名を使用します。

killall/pkill <process name>