Адрес уже используется - 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>'

11 ответов

Решение

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

или вы просто измените конфигурацию 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

Чтобы убить процесс пума, сначала запустите

    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. Прекрасно работает для меня.

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

РЕШЕНИЕ ДЛЯ ОБЩЕГО Адрес уже используется - bind(2) (Errno::EADDRINUSE)

Эта проблема связана с тем, что мы пытаемся использовать тот же порт, который уже используется. поэтому мы должны остановить службы, работающие на этом порту, чтобы мы могли запускать другие службы. мы можем использовать как kill -9 {PID}где {PID} - это PID служб, работающих на этом порту. Чтобы узнать PID любой службы, скажем, "firefox", мы можем использовать такие команды, как pidof firefox, ps aux | grep -i firefox , pgrep firefox а затем используйте kill команда, чтобы остановить эту службу.

когда-нибудь мы можем попасть в ситуацию, когда мы не знаем PID или имя службы для поиска, в этом случае мы можем использовать следующий маленький рубиновый код, чтобы сделать это за нас.(в этом случае порт 3000, вы можете изменить его в соответствии с вашими потребностями)

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

сохраните его как something.rb и запустите sudo ruby something.rb

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

sudo fuser -k -n tcp port

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

Вы можете найти и убить запущенные процессы: ps aux | grep pumaТогда вы можете убить его kill PID

Просто откройте tmp/pids/server.pid и там вы найдете pid, например->42345, просто введите kill -9 42345

У меня была эта проблема на моем Macbook Air, работающем под управлением Rails 5.0.3, Puma 5.2.2

Пытался запустить lsof -wni tcp:3000 но на этом номере порта нет процесса.

Удалось исправить это, запустив:

export PORT=3000 на моем терминале, я просто добавил эту дополнительную строку в свой .bash_profile

Для меня у меня было зависаниеrubyпроцесс из предыдущегоrails/pumaэкземпляр, на который я также ответил в соответствующем разделе вопросов и ответов . TL;DR: это было просто killall ruby -9.


Предполагается, что это более простое решение, чем этот более общий ответ . Я мог бы сначала проверить, применимо ли это, вот так:

      $ lsof -wni tcp:3000 # To know the process that blocks the port, returns:
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    10660 simon    8u  IPv4  67071      0t0  TCP *:3000 (LISTEN)
ruby    10672 simon    8u  IPv4  67071      0t0  TCP *:3000 (LISTEN)
ruby    10684 simon    8u  IPv4  67071      0t0  TCP *:3000 (LISTEN)

Он может быть старым, но в моем случае это из-за докера. Надеюсь, это поможет другим.

Другие вопросы по тегам