瘦身网络服务器:`start_tcp_server':分支切换后无接收器(运行时错误)

110

一个 Rails 3.2.0 应用,在 Thin web 服务器上本地和 Heroku cedar 堆栈上都能正常工作。

之后:

$ git branch work
$ git checkout work
$ rails server

我得到:

=> Booting Thin
=> Rails 3.2.0 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop
Exiting
/Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_tcp_server': no acceptor (RuntimeError)
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_server'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/thin-1.3.1/lib/thin/backends/tcp_server.rb:16:in `connect'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/thin-1.3.1/lib/thin/backends/base.rb:53:in `block in start'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/thin-1.3.1/lib/thin/backends/base.rb:61:in `start'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/thin-1.3.1/lib/thin/server.rb:159:in `start'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/rack-1.4.1/lib/rack/handler/thin.rb:13:in `run'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/rack-1.4.1/lib/rack/server.rb:265:in `start'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.0/lib/rails/commands/server.rb:70:in `start'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.0/lib/rails/commands.rb:55:in `block in <top (required)>'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.0/lib/rails/commands.rb:50:in `tap'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.0/lib/rails/commands.rb:50:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

此外,当我执行以下操作时:

sudo bundle exec rails server thin -p 3000

我得到:

/Users/peter/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find bundler (>= 0) amongst [bigdecimal-1.1.0, io-console-0.3, json-1.5.4, minitest-2.5.1, rake-0.9.2.2, rdoc-3.9.4] (Gem::LoadError)
from /Users/peter/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
from /Users/peter/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/rubygems.rb:1210:in `gem'
from /Users/peter/.rvm/gems/ruby-1.9.3-p125/bin/bundle:18:in `<main>'

我安装了bundler 1.0.22版本。我已经尝试更新和重新安装,但仍然无法正常运行。有任何建议吗?


1
你的机器上已经运行了其他服务器吗?也许是在Cucumber或其他什么地方? - Josh Leitzel
1
没有,实际上重新启动电脑解决了我的问题。今天又发生了。似乎是在我从一个git分支切换到另一个分支时发生的。 - maeseele
2
谢谢!我在MacOSX上遇到了错误信息... eventmachine-1.0.0/lib/eventmachine.rb:526:in \start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)`。 - JJD
当我尝试使用同一端口运行两个不同的应用程序时,我也遇到了同样的问题。这个话题让我想起了另一个正在运行的应用程序。 - Vadorequest
9个回答

226

这对我有用。找到(僵尸?)服务器(可能会发生在退出运行服务器的终端时):

$ ps ax | grep rails

如果它返回了类似于这样的内容:

33467 s002 S+ 0:00.00 grep rails
33240 s003 S+ 0:15.05 /Users/Arta/.rbenv/versions/1.9.2-p290/bin/ruby script/rails s -p 3000

结束它,重新开始:

$ kill -9 33240
$ rails s

17
如果 ps ax | grep rails 没有任何输出,尝试使用 ps ax | grep ruby - Kevin
3
如果在运行 Rails 服务器时直接关闭终端窗口,这种情况肯定会发生在 OSX 系统上。+1 - notaceo

63

2
从上面链接的文章中,一个用于查找已经运行的Rails服务器的命令(适用于Mac):ps aux | grep rails - Luke Griffiths

48

如果有其他进程锁定了该端口,您可以通过以下方式查找其PID:

$ lsof -i :3000
COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Passenger 40466 josh    5u  IPv4 0x7cae9332073ed4df      0t0  TCP *:hbci (LISTEN)
Passenger 40467 josh    5u  IPv4 0x7cae9332073ed4df      0t0  TCP *:hbci (LISTEN)

然后只需要将其/它们杀死:

$ kill -9 40466
$ kill -9 40467

ntop正在使用我的机器上的端口3000。答案完全正确。 - Tass

47

执行pgrep ruby命令以查看正在运行的服务器,然后

kill -9 serverNumber

;)


8

rvmsudo rails server thin -p 3000

这对我来说可行。


6
我遇到了这个错误是因为我在运行内置Rails的rails-dev-box
Port 3000 in the host computer is forwarded to port 3000 in the virtual machine. 
Thus, applications running in the virtual machine can be accessed via 
localhost:3000 in the host computer.

所以现在已经从Vagrant中注销并且关闭了它:
vagrant@rails-dev-box:/vagrant/rails$ exit
$ vagrant halt

那对我很有帮助。

我曾经遇到过同样的问题。我在一个独立的项目中运行了Vagrant。可能不常见,但这对我有所帮助。谢谢!+1 - jake

5

我遇到了这个错误,是因为我已经在另一个终端中运行了Rails。关闭我的其他项目解决了这个问题。


1
如果您想同时运行两个程序,可以在不同的端口上启动第二个服务器。 - Kevin
@Kevin 很好的观点。那不是我想做的,只是忘记了另一个项目正在运行。 - aarona
@DJ 那很有道理。我是为了未来的读者发布我的评论 :) - Kevin

2

在终端中执行此命令

sudo netstat -lpn |grep rails

然后。
sudo kill <job id>

这是我能找到我的进程的唯一方法,尽管我不得不使用grep查找thin而不是rails。 - skillet-thief
是的,它在大多数情况下都有效。如果你喜欢,请投一票支持。 - Sam
找到并杀死进程ID就解决了问题。虽然第一个命令对我没用,但是 ps aux | grep rails 命令有效。 - Francisco Quintero

2

我在度假后回到办公室时遇到了类似的问题。我的服务器运行在本地IP上,如下:

rails s thin -b <my_ip>

问题在于我的IP地址已更改,我只需要使用新的IP地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接