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

130

Я пытаюсь развернуть приложение 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
это именно то, что он говорит. кто-то уже использует порт 3000. Используйте netstat, чтобы выяснить, кто находится на порту 3000
Мирча
4
Когда пытаюсь его убить, выдает ошибку kill -59780 PID. Говорит мне invalid signal specification. Раньше я lsof -wni tcp:3000показывал, что использует порт 3000.
Корнелиус Уилсон,
1
kill -9 59780 (так что "kill -9 pid_id" в целом)
Mircea

Ответы:

288

Вам нужно использовать kill -9 59780с 59780замененным на найденный номер PID (используйте, 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
Zoker
источник
спасибо за этот ответ. У меня такая же ошибка с OP. и я понял, что уже делаю rails sна другом терминале. Вот почему я получил эту ошибку. затем я использовал порт diff для запуска сервера rails s -p 9090
Fai Zal Dong
129

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

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

Саво Клифф
источник
Спасибо @ sawo-cliff, моя проблема решена. У меня было другое приложение, работающее на порту 3000.
Номис
3
Как этот ответ добавляет больше информации, чем принято год назад?
Андре Фигейредо
1
@AndreFigueiredo, не совсем уверен, что следую за вашим вопросом, но из того немногого, что я могу почерпнуть из него, мой ответ добавил, как узнать, какой идентификатор процесса запущен, чтобы знать, что убить.
Sawo Cliff
Да. Теперь я вижу, что исходный ответ содержал ту же информацию. Но я не совсем понимал, что мне нужно делать, пока не прочитал эту версию.
Джефф Живкович
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 67661if на 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
1

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

Али
источник
0

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

sudo fuser -k -n tcp port

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

Nsoseka
источник