Адрес уже используется - 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)
Он может быть старым, но в моем случае это из-за докера. Надеюсь, это поможет другим.