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

Cor*_*son 115 ruby-on-rails puma

我正在尝试使用Puma Web服务器部署Rails应用程序.当尝试使用配置文件启动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>'
Run Code Online (Sandbox Code Playgroud)

小智 263

你需要使用kill -9 59780(用于lsof -wni tcp:3000查看哪个进程使用了3000端口并获取进程pid)

或者你只是修改彪马配置更改TCP端口tcp://127.0.0.1:300030009292或者没有使用其他端口.

或者你可以使用启动你的rails应用程序

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Run Code Online (Sandbox Code Playgroud)


Saw*_*iff 115

首先要杀死美洲狮过程

    lsof -wni tcp:3000 
Run Code Online (Sandbox Code Playgroud)

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

例如,在运行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)
Run Code Online (Sandbox Code Playgroud)

现在运行以下命令来终止进程.(其中3366是PID)

kill -9 3366
Run Code Online (Sandbox Code Playgroud)

应该解决这个问题

  • 这个答案如何增加比一年前接受的更多信息? (3认同)

ana*_*ana 26

你也可以尝试这个技巧:

ps aux | grep puma
Run Code Online (Sandbox Code Playgroud)

样本输出:

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]
Run Code Online (Sandbox Code Playgroud)

然后:

kill 67661
Run Code Online (Sandbox Code Playgroud)


Fla*_*che 6

在这个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?
Run Code Online (Sandbox Code Playgroud)

您可以在 irb 中或 ruby​​ 文件中运行它。

对于后者,创建server_killer.rb然后运行它ruby server_killer.rb