8

次のSinatraアプリケーションを実行しようとしていますが、ポートがすでに使用されているか、root権限がないため、サーバーを起動できないというエラーメッセージが表示されます。Sinatraアプリケーションを開始する前に、この問題が発生したことはありません。数日前にMac用にMountainLionにアップデートしましたが、これが問題の原因である可能性があるのではないかと思います。私も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に固有のものだと思います。さらに、ポートを明示的に設定するように指示されたこのラックチュートリアルを試し始めた数日前まで、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 と呼ばれる「スペース」を占有しています。新しいサーバーを起動しようとすると、既に 1 つのサーバーが実行されています。駐車場のようなものです。そこにはすでに車があるため、同じ場所で新しい車を手放すことはできません。

これが私がエラーを再現した方法です。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

同じ結果が得られます。

-出力は次のようになります。リストには 2 つのものが含まれている必要があります。

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

最初のものは、探している実際の「ゾンビ サーバー」です。2 番目の点は面白いことに、ruby という単語を含むすべてのプロセスを探しているので、ruby という単語を含むすべてのプロセスを探しているプロセスを見つけます。ハハ。

最初のプロセスを終了します。次のコマンドで。数字を実際のプロセス ID に変更してください。

kill -9 27235

27235 を表示される実際のプロセス ID に変更する必要がありますが、アイデアは得られます。レッカー車が来て、車を廃品置き場に引きずり込み、その場所を自由に使えるようにしてくれました。

古い答え:

私はまったく同じ問題を抱えていました.sinatraアプリを実行しているポートでRubyプロセスが実行されていたためです。以下は、エラー (簡潔にするためにスタック トレースを削除したもの) と、何が問題なのかを突き止めて修正するために実行したコマンドです。

つまり、sinatra アプリを起動しようとしたところ、ポートが使用中かルート権限が必要であると表示されました。次に、Tin Man の lsof コマンド (上記を参照) を使用して、使用中のポートを調べました。

ruby がポート 9393 で実行されていることがわかりました。killall で kill しました。シナトラアプリを再起動してみました。出来た。

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 だけであるという制限は、Ruby とは何の関係もありません。これは OS の問題です。また、一般的に、それは良いことです。

sinatraプロセスを開始できません - eventmachine 'no acceptor'」を見てください。

リンクには 2 つの提案があります。

  1. 彼が遭遇した構成の問題は、あなたの問題を解決するかもしれません
  2. 他に何もないとしても、リンクはポート番号を(別の、おそらくそれ以上の)番号に変更する方法も示しています。
于 2012-12-27T06:01:12.350 に答える