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


130

我正在尝试通过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>'

1
这就是它所说的。有人已经在使用端口3000。使用netstat找出谁在端口3000上
Mircea 2015年

4
当我尝试杀死它时,我得到一个错误kill -59780 PID。告诉我invalid signal specification。我曾经lsof -wni tcp:3000向人们展示了使用3000端口的情况。–
Cornelius Wilson

1
杀死-9 59780(因此通常称为“杀死-9 pid_id”)
Mircea

Answers:


288

您需要使用kill -9 5978059780与发现PID号替换(使用lsof -wni tcp:3000,看看哪个过程中使用的3000端口,并获得进程的PID)。

或者,您可以只修改puma配置,将tcp端口tcp://127.0.0.1:3000从更改30009292或其他未使用的端口。

或者,您可以使用以下方法启动Rails应用程序:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001

谢谢你的回答。我在OP上遇到了同样的错误。我意识到我已经rails s在另一个候机楼了。所以这就是为什么我得到那个错误。然后我用diff端口启动服务器 rails s -p 9090
Fai Zal Dong

129

杀死彪马过程首先要跑

    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

应该解决问题


感谢@ SAWO悬崖它解决了我的问题,我有一个其他应用程序在端口3000上运行
NOMIS

3
这个答案如何比一年前增加更多的信息?
Andre Figueiredo

1
@AndreFigueiredo,不太确定我是否遵循您的问题,但是从我能从中收集到的一点信息中,我的答案添加了如何知道正在运行哪个进程ID的信息,从而知道要杀死什么。
Sawo Cliff

是。现在,我可以看到原始答案DID包含相同的信息。但是直到阅读此版本,我才完全不知道需要做什么。
杰夫·齐夫科维奇

28

您也可以尝试以下技巧:

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

使用kill -9 67661if kill 67661并不会真正杀死您的进程(按照上面的示例)。那对我有用!干杯!
威廉汉普郡

3

在此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


这对我有用,谢谢,但是我似乎不需要它了,所以我取出了sudo。
Obromios

1

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


0

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

sudo fuser -k -n tcp port

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.