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>'
kill -9 59780
を使用する必要があります(lsof -wni tcp:3000
を使用して、3000
ポートを使用しているプロセスを確認し、プロセスpidを取得します)
または、単にpuma構成を変更して、tcpポートtcp://127.0.0.1:3000
を3000
から9292
または使用されていない他のポートに変更します。
またはを使用してRailsアプリを起動できます
bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
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
問題を解決する必要があります
このトリックを試すこともできます:
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
この 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
で実行します
上記のソリューションがubuntu/linuxで動作しない場合は、これを試すことができます
Sudo fuser -k -n tcp port
数回実行して、選択したポートのプロセスを強制終了します。たとえば、ポートは3000です。コマンドの実行後に出力が表示されない場合は、すべてのプロセスを強制終了していました。