Ruby on Rails - 地址已被占用 - 在“0.0.0.0”端口3000上绑定(2)(Errno::EADDRINUSE)

4

当我尝试从本地启动我的Rails服务器时,我收到以下错误消息。

/Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:269:in `initialize': Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE)
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:269:in `new'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:269:in `add_tcp_listener'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:105:in `block in parse'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:88:in `each'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/binder.rb:88:in `parse'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/runner.rb:144:in `load_and_bind'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/cluster.rb:391:in `run'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/puma/launcher.rb:174:in `run'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/puma-3.9.1/lib/rack/handler/puma.rb:69:in `run'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rack-2.0.3/lib/rack/server.rb:297:in `start'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.0.3/lib/rails/commands/server.rb:104:in `start'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:90:in `block in server'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:85:in `tap'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:85:in `server'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/railties-5.0.3/lib/rails/commands.rb:18:in `<top (required)>'
from /Users/zachdobbs/sample_app/bin/rails:9:in `require'
from /Users/zachdobbs/sample_app/bin/rails:9:in `<top (required)>'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `load'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `call'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/bin/spring:49:in `<top (required)>'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `load'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `<top (required)>'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:68:in `require'
from /Users/zachdobbs/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:68:in `require'
from /Users/zachdobbs/sample_app/bin/spring:15:in `<top (required)>'
from bin/rails:3:in `load'
from bin/rails:3:in `<main>'

我突然遇到了这个错误,不确定原因。当我在网上查找时,发现问题可能是另一个服务正在3000端口运行,但当我尝试运行'lsof -i tcp:3000'时,没有结果。

在puma.rb中,我进行了定义。

port        ENV.fetch("PORT") { 3000 }
rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

当我将端口值更改为例如8080时,服务器就会运行。我很困惑为什么服务器无法在3000端口上启动。我尝试运行的每个命令都显示该端口上没有运行的服务。


你是否尝试以root身份运行lsof -i tcp:3000?如果没有,请使用sudo运行。因为该进程可能正在其他用户下运行。请尝试sudo lsof -i :3000 | grep LISTEN - Maksim Kalmykov
@MaksimKalmykov 以sudo身份运行仍然没有给我任何结果。 - Zach Dobbs
当你在浏览器中运行 localhost:3000 时,它会返回什么? - sa77
@sa77 'Safari 无法连接到服务器' - Zach Dobbs
3个回答

3
我知道这是一个非常老的帖子,但我必须回答一下以防其他人像我一样来到这里。
当你在puma配置中声明端口(port)或绑定(bind)命令时,它会尝试绑定到所有这些端口或地址。
在这种情况下,您指定了两次端口(port),因此它正在尝试绑定到这两个端口,第二个将失败。

这是正确的。使用 puma 时,默认使用端口号为 3000。当我们指定相同的端口号时,它将抛出此错误。 - babie

0

请尝试以下方法:

> sudo ps ax | grep rails
#1338 pts/1    Sl+    0:06 /usr/bin/ruby2.3 bin/rails c
#1707 pts/0    Rl+    0:07 /usr/bin/ruby2.3 bin/rails s

> sudo kill -9 1707

> rails s

执行 sudo ps ax | grep rails 命令只返回一个结果:1559 s000 S+ 0:00.00 grep rails,而尝试执行 sudo kill -9 1559 则会出现 kill: 1559: No such process 的错误提示。 - Zach Dobbs
不,你不应该杀掉 grep rails,你必须杀掉以 bin/rails s 结尾的进程 ID。我提到了 rails c 是因为我也在运行 Rails 控制台。 - Abhi
啊,我现在明白了。然而问题仍然存在,没有显示任何服务器实例,并且端口3000似乎未被使用,所以我仍然不明白为什么服务器无法启动。 - Zach Dobbs

0
对我来说,解决方案非常简单。但请注意(正如命令所说),它会关闭所有的 Ruby 实例。你可以采用比这更精细的方式来解决,例如使用像 Abhi 提到的策略
killall ruby

所有其他的事情都没有帮助我:

killall rails
# -> rails: no process found
killall puma
# -> puma: no process found

您也可以考虑以下可能相关的问题:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接