ruby on rails - rails - 地址已在使用中-bind(2)(Errno:: EADDRINUSE)
rails puma部署 (4)
在此 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
一起运行
我正在尝试通过Puma Web服务器部署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>'
如果上述解决方案在ubuntu / linux上不起作用,那么您可以尝试一下
sudo fuser -k -n tcp port
多次运行它以终止所选端口上的进程。 例如,端口可能是3000。 如果在运行命令后看不到输出,则将杀死所有进程
您需要使用
kill -9 59780
(使用
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
杀死彪马过程的第一步
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
应该解决问题