Адрес уже используется - bind (2) (Errno:: EADDRINUSE)

Я пытаюсь развернуть приложение Rails с веб-сервером Puma. При попытке запустить 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

вам нужно использовать kill -9 59780 (используйте lsof -wni tcp:3000, чтобы узнать, какой процесс использовал порт 3000 и получить процесс pid)

или вы просто измените конфигурацию puma, измените порт tcp tcp://127.0.0.1:3000 с 3000 на 9292 или другой порт, который не был использован.

или вы можете запустить приложение для рельсов, используя

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

Ответ 2

Чтобы сначала запустить процесс 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

Должно решить проблему

Ответ 3

Вы также можете попробовать этот трюк:

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

Ответ 4

Нашел script ниже в этом 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 или внутри рубинового файла.

Для последнего создайте server_killer.rb, затем запустите его с помощью ruby server_killer.rb

Ответ 5

Если вышеуказанные решения не работают в Ubuntu/Linux, вы можете попробовать это

sudo fuser -k -n tcp port

Запустите его несколько раз, чтобы убить процессы на выбранном вами порту. порт может быть 3000, например. Вы бы убили все процессы, если бы не увидели вывод после выполнения команды