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

时间:2015-06-25 02:00:32

标签: ruby-on-rails puma

我正在尝试使用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>'

9 个答案:

答案 0 :(得分:232)

您需要使用kill -9 59780(使用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

答案 1 :(得分:93)

首先要杀死美洲狮过程

    lsof -wni tcp:3000 

显示使用端口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)

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

kill -9 3366

应解决问题

答案 2 :(得分:14)

你也可以尝试这个技巧:

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 67661

答案 3 :(得分:2)

在此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 $2 }' | head -n 1`.strip
puts "PID: #{pid}"
`kill -9 #{pid}` unless pid.empty?

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

对于后者,请创建server_killer.rb,然后使用ruby server_killer.rb

运行它

答案 4 :(得分:2)

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

这个问题是因为我们正在尝试使用已经被使用的同一个端口。所以我们必须停止在该端口上运行的服务,以便我们可以运行其他服务。 我们可以像 delimiter $$ create trigger date_check_update before update on <the table name goes here> for each row begin if (old.date IS NOT NULL) then signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message'; end if ; end $$ delimiter ; 一样使用 kill,其中 {PID} 是在该端口上运行的服务的 PID。要知道任何服务的 PID,比如“firefox”,我们可以使用 kill -9 {PID}pidof firefoxps aux | grep -i firefox 等命令,然后使用 pgrep firefox 命令停止该服务。< /p>

有时我们可能会遇到不知道要搜索的 kill 或服务名称的情况,在这种情况下,我们可以使用以下小 ruby​​ 代码为我们完成。(在这种情况下3000端口,可根据需要自行更改)

PID

将其另存为 something.rb 并运行 #!/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?

答案 5 :(得分:1)

您可以找到并杀死正在运行的进程:ps aux | grep puma 然后您可以用kill PID

杀死它

答案 6 :(得分:0)

如果以上解决方案在ubuntu / linux上不起作用,那么您可以尝试

sudo fuser -k -n tcp port

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

答案 7 :(得分:0)

它可能很旧,但就我而言,这是因为docker。希望对别人有帮助。

答案 8 :(得分:0)

我在运行 Rails 5.0.3、Puma 5.2.2 的 Macbook Air 上遇到了这个问题

尝试运行 lsof -wni tcp:3000 但在此端口号上没有进程。

通过运行设法解决了这个问题:

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