8

我正在尝试运行以下 Sinatra 应用程序并收到一条错误消息,告诉我无法启动服务器,原因可能是端口已在使用中,或者因为我没有 root 权限。在启动 Sinatra 应用程序之前,我从未遇到过这个问题。几天前,我为我的 mac 更新了 Mountain Lion,想知道这是否是问题的原因。我也使用 RVM。谁能给个建议...

require "sinatra"

class MyApp < Sinatra::Base
 get '/' do
    "Hello from MyApp"

 end

end 

== Sinatra/1.3.3 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop
/Users/me/.rvm/gems/ruby-1.9.2-p290@global/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)

更新:我仍然可以在我的机器上运行 rails 服务器,所以我认为问题是 Sinatra 特有的。此外,直到几天前,当我开始玩这个 Rack Tutorial时,我才能够很好地运行 Sinatra 应用程序,它指示我明确设置端口。我想知道这是否会产生永久性的变化。

>> Rack::Handler::WEBrick.run my_rack_proc, :Port => 9876
[2011-10-24 11:32:21] INFO  WEBrick 1.3.1
[2011-10-24 11:32:21] INFO  ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 11:32:21] INFO  WEBrick::HTTPServer#start: pid=480 port=9876
4

2 回答 2

15

注意:我之前有不同的答案。我已经用一个新的、更集中的答案代替了它,但我把旧答案留在了底部,供仍在寻找它的人使用。

新答案:

此错误是由于您上次运行服务器时关闭终端而没有终止服务器造成的。我相信这被称为“无头奔跑”,就像一只被砍头的鸡。因此,即使周围没有人在看,服务器仍在运行并占用称为端口 9393 的“空间”。当您尝试启动新服务器时,已经有一个服务器在运行。这有点像一个停车位:因为那里已经有一辆车,所以你不能在同一个地方分开一辆新的。

这是我重现错误的方式。我启动了一个 sinatra 服务器,关闭了终端而没有先杀死服务器,打开一个新终端,然后尝试启动另一台服务器。

Taras-MacBook-Air:SurveyDBCGroupProject tlroys$ shotgun == Shotgun/Thin on http://127.0.0.1:9393/ Thin web server (v1.6.1 codename Death Proof) Maximum connections set to 1024 Listening on 127.0.0.1:9393, CTRL+C to stop /Users/tlroys/.rvm/gems/ruby-1.9.3-p484/gems/eventmachine-1.0.3/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError) #deleted stack trace

如果一辆车停在你的位置,你会怎么做?你可以打电话给拖车,告诉司机这辆车的车牌号,让他们把它拖走。

要找出汽车的车牌号,请运行我在 Stack Overflow 上找到的以下命令集

ps aux | grep ruby

这会找到进程 ID,也就是占用“停车位”的“汽车”的车牌号。注意:占据我“位置”的服务器实际上是使用编程语言 ruby​​ 编写的服务器:有点像某些汽车是雪佛兰。我可以告诉查车牌的人去找雪佛兰,只要周围没有其他车,他就会找到合适的车。由于这个“僵尸服务器”是我计算机上运行的唯一 ruby​​ 进程,因此告诉 grep 命令查找 ruby​​ 将给出正确的进程 ID/车牌号。如果我想更具体一点,我可能会说

ps aux | grep shotgun

并得到相同的结果。

- 输出应该是这样的:列表中应该有两件事

27235 ?? S 0:00.72 /Users/tlroys/.rvm/gems/ruby-1.9.3-p484/bin/shotgun 27393 s000 S+ 0:00.00 grep ruby

第一个是您正在寻找的实际“僵尸服务器”。第二件事很有趣,因为您正在查找包含单词 ruby​​ 的所有进程,因此它会找到正在查找包含单词 ruby​​ 的所有进程的进程。哈哈。

杀死第一个进程。使用以下命令。确保将数字更改为实际的进程 ID:

kill -9 27235

您必须将 27235 更改为您看到的实际进程 ID,但您明白了。拖车来了,把车拖到垃圾场,把那个地方留给我用。

老答案:

我遇到了完全相同的问题,据我所知,这是因为在我运行 sinatra 应用程序的端口上运行了一个 ruby​​ 进程。下面是错误(为简洁起见删除了堆栈跟踪)和我运行的命令以找出问题所在并修复它。

简而言之,我试图启动我的 sinatra 应用程序,它说端口正在使用中或需要 root 权限。然后我使用 Tin Man 的 lsof 命令(如上所示)找出正在使用的端口。

它表明 ruby​​ 正在端口 9393 上运行。我用 killall 杀死了它。我尝试再次启动我的 sinatra 应用程序。有效。

Taras-MacBook-Air:sinatra_sandbox tlroys$ bundle exec shotgun config.ru 
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
== Shotgun/Thin on http://127.0.0.1:9393/
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 127.0.0.1:9393, CTRL+C to stop
/Users/tlroys/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Taras-MacBook-Air:sinatra_sandbox tlroys$ lsof -i TCP | grep LISTEN
ruby      59176 tlroys    9u  IPv4 0xffffff8012fbdc00      0t0  TCP localhost:9393 (LISTEN)
Taras-MacBook-Air:sinatra_sandbox tlroys$ killall ruby
Taras-MacBook-Air:sinatra_sandbox tlroys$ bundle exec shotgun config.ru 
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
Shotgun/Thin on http://127.0.0.1:9393/
Thin web server (v1.5.0 codename Knife)
Maximum connections set to 1024
Listening on 127.0.0.1:9393, CTRL+C to stop
于 2013-10-30T15:55:46.273 回答
1

只有 root 才能打开“众所周知的端口#s”的限制与 Ruby 无关 - 这是操作系统的事情。一般来说,这也是一件好事。

查看“无法启动 sinatra 进程 - eventmachine 'no acceptor' ”。

链接中有两个建议:

  1. 他遇到的配置问题很可能会解决你的问题
  2. 如果没有别的,该链接还向您展示了如何更改端口号(更改为不同的 - 并且可能更高)号码。
于 2012-12-27T06:01:12.350 回答