アドレスはすでに使用中-bind(2)(Errno :: EADDRINUSE)


130

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

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

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>'

1
それはまさにそれが言うことです。誰かがすでにポート3000を使用しています。netstatを使用して、ポート3000に接続しているユーザーを特定してください
Mircea

4
私がそれを殺そうとすると、エラーが出ますkill -59780 PID。教えますinvalid signal specification。以前lsof -wni tcp:3000はポート3000 を使用しているものを示していました。–
Cornelius Wilson、

1
kill -9 59780(一般的に "kill -9 pid_id")
Mircea

回答:


288

あなたは使用する必要があるkill -9 5978059780見られるPID番号(使用に置き換えlsof -wni tcp:3000使用されるプロセスかを確認するために3000ポートをし、プロセスPIDを取得します)。

または、puma構成を変更して、tcpポートをtcp://127.0.0.1:3000から30009292または使用されていない他のポートに変更することもできます。

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

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

この回答をありがとうございます。OPで同じエラーが発生しました。私が気づいたことは、すでにrails s別の端末で行っていることです。だからこそ、私はそのエラーを受け取りました。次に、diffポートを使用してサーバーを起動しました rails s -p 9090
Fai Zal Dong

129

ピューマプロセスを最初に実行するには

    lsof -wni tcp:3000 

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

たとえば、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

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


@ sawo-cliffのおかげで、問題が解決しました。ポート3000で別のアプリケーションを実行していました
。– Nomis

3
この回答は、1年前に受け入れられたものよりも多くの情報をどのように追加しますか?
Andre Figueiredo 2016

1
@AndreFigueiredo、私があなたの質問を確実にフォローしていることは確かではありませんが、それから収集できる少しから、私の答えは、どのプロセスIDが実行されているかを知る方法を追加して、何を殺すかを知ることです。
Sawo Cliff 2016

はい。元の回答DIDに同じ情報が含まれていることがわかります。しかし、このバージョンを読むまで、私は何をする必要があるのか​​完全に理解していませんでした。
Jeff Zivkovic 2016年

28

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

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

(上記の例のように)実際にプロセスを強制終了しないkill -9 67661場合に使用kill 67661します。それは私のために働いた!乾杯!
ウィリアムハンプシャー

3

このgithubの問題で以下のスクリプトを見つけました。私にとってはうまくいきます。

#!/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


これでうまくいきましたが、sudoは必要ないようだったので取り出しました。
Obromios 2018

1

あなたは実行中のプロセスを見つけて殺すことができます:ps aux | grep puma それからあなたはそれを殺すことができますkill PID


0

上記の解決策がubuntu / linuxで機能しない場合は、これを試すことができます

sudo fuser -k -n tcp port

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.