web-dev-qa-db-ja.com

すでに使用されているアドレス-bind(2)(Errno :: EADDRINUSE)

Puma WebサーバーでRailsアプリをデプロイしようとしています。設定ファイルbundle exec puma -C config/puma.rbを使用してPumaサーバーを起動しようとすると、アドレスが既に使用されているというエラーが表示されます。

誰かがこれを修正する方法を知っていますか?

bundle exec puma -C config/puma.rb
[23699] Puma starting in cluster mode...
[23699] * Version 2.11.3 (Ruby 2.0.0-p353), codename: Intrepid Squirrel
[23699] * Min threads: 5, max threads: 5
[23699] * Environment: development
[23699] * Process workers: 2
[23699] * Preloading application
Jdbc-MySQL is only for use with JRuby
[23699] * Listening on tcp://0.0.0.0:3000
/.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `new'
    from /Users/lexi87/.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `add_tcp_listener'
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:96:in `block in parse'
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:82:in `each'
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:82:in `parse'
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/runner.rb:119:in `load_and_bind'
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/cluster.rb:302:in `run'
    from /.rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/cli.rb:216:in `run'
    from /rvm/gems/Ruby-2.0.0-p353/gems/puma-2.11.3/bin/puma:10:in `<top (required)>'
    from /.rvm/gems/Ruby-2.0.0-p353/bin/puma:23:in `load'
    from /.rvm/gems/Ruby-2.0.0-p353/bin/puma:23:in `<main>'
    from /.rvm/gems/Ruby-2.0.0-p353/bin/Ruby_executable_hooks:15:in `eval'
    from /.rvm/gems/Ruby-2.0.0-p353/bin/Ruby_executable_hooks:15:in `<main>'
98

kill -9 59780を使用する必要があります(lsof -wni tcp:3000を使用して、3000ポートを使用しているプロセスを確認し、プロセスpidを取得します)

または、単にpuma構成を変更して、tcpポートtcp://127.0.0.1:30003000から9292または使用されていない他のポートに変更します。

またはを使用してRailsアプリを起動できます

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
239
Zoker

Pumaプロセスを最初に実行するには

    lsof -wni tcp:3000 

ポート3000を使用しているものを表示します。次に、結果に付属するPIDを使用して、強制終了プロセスを実行します。

たとえば、lsof -wni tcp:3000を実行すると、次のようなメッセージが表示される場合があります

    COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    Ruby    3366 dummy    8u  IPv4  16901      0t0  TCP 127.0.0.1:3000 (LISTEN)

次に、以下を実行してプロセスを強制終了します。 (3366はPIDです)

kill -9 3366

問題を解決する必要があります

96
Sawo Cliff

このトリックを試すこともできます:

ps aux | grep puma

サンプル出力:

myname           77921   0.0  0.0  2433828   1972 s000  R+   11:17AM   0:00.00 grep puma
myname           67661   0.0  2.3  2680504 191204 s002  S+   11:00AM   0:18.38 puma 3.11.2 (tcp://localhost:3000) [my_proj]

その後:

kill 67661
16
ana

この github issue で以下のスクリプトを見つけました。私には最適です。

#!/usr/bin/env Ruby
port = ARGV.first || 3000
system("Sudo echo kill-server-on #{port}")

pid = `Sudo lsof -iTCP -sTCP:LISTEN -n -P | grep #{port} | awk '{ print $2 }' | head -n 1`.strip
puts "PID: #{pid}"
`kill -9 #{pid}` unless pid.empty?

IrbまたはRubyファイル内で実行できます。

後者の場合、server_killer.rbを作成してからRuby server_killer.rbで実行します

2
Flavio Wuensche

上記のソリューションがubuntu/linuxで動作しない場合は、これを試すことができます

Sudo fuser -k -n tcp port

数回実行して、選択したポートのプロセスを強制終了します。たとえば、ポートは3000です。コマンドの実行後に出力が表示されない場合は、すべてのプロセスを強制終了していました。

0
Nsoseka