Rails:地址已在使用 - bind(2) (Errno::EADDRINUSE)
Rails: Address already in use - bind(2) (Errno::EADDRINUSE)
我正在尝试使用 Puma 网络服务器部署 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>'
您需要使用 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
先杀死puma进程运行
lsof -wni tcp:3000
显示什么正在使用端口 3000。然后使用结果附带的 PID 运行 终止进程。
例如在 运行ning 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
应该可以解决问题
在此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 }' | 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
杀死它
它可能是旧的,但就我而言,这是因为 docker。希望对其他人有帮助。
通用地址已在使用中的解决方案 - bind(2) (Errno::EADDRINUSE)
这个问题是因为我们正在尝试使用已经被使用的同一个端口。所以我们必须停止该端口上的服务 运行ning 以便我们可以 运行 其他服务。
我们可以像 kill -9 {PID}
那样使用 kill
,其中 {PID} 是该端口上 运行ning 服务的 PID。要知道任何服务的 PID,可以说“firefox”,我们可以使用 pidof firefox
、ps aux | grep -i firefox
、pgrep firefox
等命令,然后使用 kill
命令停止该服务。
有时我们可能会遇到不知道 PID
或要搜索的服务名称的情况,在这种情况下,我们可以使用以下 ruby 代码来完成us.(这里是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 }' | 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.2
上遇到了这个问题
尝试过运行
lsof -wni tcp:3000
但是这个端口号上没有进程。
已通过 运行 解决此问题:
export PORT=3000
在我的终端上,然后我将这条额外的行添加到我的 .bash_profile
我正在尝试使用 Puma 网络服务器部署 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>'
您需要使用 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
先杀死puma进程运行
lsof -wni tcp:3000
显示什么正在使用端口 3000。然后使用结果附带的 PID 运行 终止进程。
例如在 运行ning 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
应该可以解决问题
在此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 }' | 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
它可能是旧的,但就我而言,这是因为 docker。希望对其他人有帮助。
通用地址已在使用中的解决方案 - bind(2) (Errno::EADDRINUSE)
这个问题是因为我们正在尝试使用已经被使用的同一个端口。所以我们必须停止该端口上的服务 运行ning 以便我们可以 运行 其他服务。
我们可以像 kill -9 {PID}
那样使用 kill
,其中 {PID} 是该端口上 运行ning 服务的 PID。要知道任何服务的 PID,可以说“firefox”,我们可以使用 pidof firefox
、ps aux | grep -i firefox
、pgrep firefox
等命令,然后使用 kill
命令停止该服务。
有时我们可能会遇到不知道 PID
或要搜索的服务名称的情况,在这种情况下,我们可以使用以下 ruby 代码来完成us.(这里是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 }' | 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.2
上遇到了这个问题尝试过运行
lsof -wni tcp:3000
但是这个端口号上没有进程。
已通过 运行 解决此问题:
export PORT=3000
在我的终端上,然后我将这条额外的行添加到我的 .bash_profile