Rails: 已经在使用中的地址-bind (2)(Errno: : EADDRINUSE)

我试图部署与彪马网络服务器的 Rails 应用程序。当尝试使用配置文件 bundle exec puma -C config/puma.rb启动 Puma 服务器时,我得到一个错误,即地址已经在使用中。

有人知道怎么修吗?

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>'
146288 次浏览

您需要使用 kill -9 59780,将 59780替换为找到的 PID 号(使用 lsof -wni tcp:3000查看哪个进程使用了 3000端口并获得进程 PID)。

或者您可以只修改 puma 配置,将 tcp 端口 tcp://127.0.0.1:30003000更改为 9292或其他未使用的端口。

或者你可以使用以下命令来启动你的 Rails 应用程序:

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

要终止美洲狮进程首先运行

lsof -wni tcp:3000

显示使用端口3000的内容。然后使用结果附带的 PID 来运行 kill 进程。

例如,在运行 lsa-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

应该能解决问题

在这个 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运行它

你也可以试试这个技巧:

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 -9 67661

如果上面的解决方案不能在 ubuntu/linux 上运行,那么你可以试试这个

sudo fuser -k -n tcp port

多次运行它以在您选择的端口上终止进程。例如端口可以是3000。如果在运行命令后没有看到任何输出,那么就会杀死所有进程

可以查找并终止正在运行的进程: ps aux | grep puma 然后你可以用 kill PID杀死它

它可能是旧的,但在我的情况下,它是因为码头。希望它能帮助别人。

通用地址的解决方案-bind (2)(Errno: : EADDRINUSE)

这个问题是因为我们试图使用已经在使用的同一个端口。所以我们必须停止在那个端口上运行的服务,这样我们才能运行另一个服务。 我们可以像 kill -9 {PID}一样使用 kill,其中{ PID }是在该端口上运行的服务的 PID。要知道任何服务的 PID,可以说“ firefox”,我们可以使用像 pidof firefoxps aux | grep -i firefoxpgrep 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

我在 Macbook Air 上运行 Rails 5.0.3,Puma 5.2时遇到了这个问题

试过逃跑 但这个端口号没有进程。

通过运行以下命令设法解决了这个问题:

我的终端上的 export PORT=3000,然后我刚刚添加了这个额外的行到我的 .bash_profile