Адрес уже используется - 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, например. Вы бы убили все процессы, если бы не увидели вывод после выполнения команды