MacBook Air(OS X Mountain Lion 10.8.4)
で、
WEBrick::HTTPServer.new( :Port => 8099 )
の実行をすると、
WARN TCPServer Error: Address already in use - bind(2)
の警告が出るのを解決できず困っています。
例えば;
$ ruby -v -r webrick -e 'WEBrick::HTTPServer.new( :Port => 8099 )'
のコマンドの実行で;
上記のような警告が出ます。
(ポート番号は 8099 でなくても 3000 などでも同じ。)
別の例では;
------------------------------------------------------------------------------
で、
WEBrick::HTTPServer.new( :Port => 8099 )
の実行をすると、
WARN TCPServer Error: Address already in use - bind(2)
の警告が出るのを解決できず困っています。
例えば;
$ ruby -v -r webrick -e 'WEBrick::HTTPServer.new( :Port => 8099 )'
のコマンドの実行で;
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]
[2013-06-18 16:22:15] INFO WEBrick 1.3.1
[2013-06-18 16:22:15] INFO ruby 2.0.0 (2013-05-14) [x86_64-darwin12.3.0]
[2013-06-18 16:22:15] WARN TCPServer Error: Address already in use - bind(2)
上記のような警告が出ます。
(ポート番号は 8099 でなくても 3000 などでも同じ。)
別の例では;
------------------------------------------------------------------------------
# ファイル名 ex1.rb
require 'webrick'
require 'webrick'
server = WEBrick::HTTPServer.new( :Port => 8099, :DocumentRoot => '.' )
trap(:INT) do
server.shutdown
end
server.start
------------------------------------------------------------------------------
上記ファイル ex1.rb を実行すると;
(Control + c で終了)
------------------------------------------------------------------------------
上記ファイル ex1.rb を実行すると;
$ ruby ex1.rb
[2013-06-18 16:11:07] INFO WEBrick 1.3.1
[2013-06-18 16:11:07] INFO ruby 2.0.0 (2013-05-14) [x86_64-darwin12.3.0]
[2013-06-18 16:11:07] WARN TCPServer Error: Address already in use - bind(2)
[2013-06-18 16:11:07] INFO WEBrick::HTTPServer#start: pid=383 port=8099
(Control + c で終了)
[2013-06-18 16:11:12] INFO going to shutdown ...
[2013-06-18 16:11:12] INFO WEBrick::HTTPServer#start done.
となります。
(ウェブサーバーは動いているようです。)
$ lsof -i:8099
$ lsof | grep 8099
$ ps -af | grep ruby
などのコマンドで、二重に起動しているプロセス探して、そのプロセスのPID番号を止める
$ kill -9 PID番号
を実行すればよい
Ruby のバージョンは
・2.0.0-p.195
・1.8.7-p.358
の2通りでも同じでした。
そこで、別の Mac で実行してみると、なんと警告が出ません!
・OS X Mountain Lion(10.8.4)
・OS X Lion(10.7.5)
・Ruby 2.0.0-p.195
・Ruby 1.8.7-p.358
すべての組み合わせで警告が出ませんでした。
な〜んだ
ということは、私のMacBook Air 固有の問題のようです。
そこで、 OS X 10.8.4 をクリーンインストールし直して、新規ユーザーアカウントを作ってみました。
ところが、それでも同じ警告が出ます!
ということは、自分のMac のハードウェア側の問題でしょうか?
でも、
・NVRAM(PRAM)のリセット
・SMC のリセット
を実行しましたが、それでも症状は変わりません。
------------------------------------------------------------------------------
ただし、その際のウェブサーバーの挙動が少し違ったものになるのが気になります。
$ lsof | grep IPv6
となります。
(ウェブサーバーは動いているようです。)
------------------------------------------------------------------------------
この、
WARN TCPServer Error: Address already in use - bind(2)
の警告の解決法をネットで検索すると;WARN TCPServer Error: Address already in use - bind(2)
$ lsof -i:8099
$ lsof | grep 8099
$ ps -af | grep ruby
などのコマンドで、二重に起動しているプロセス探して、そのプロセスのPID番号を止める
$ kill -9 PID番号
を実行すればよい
------------------------------------------------------------------------------
というのがほとんどですが、これでは解決しませんでした。
($ ruby ex1.rb を実行中は、ターミナルをもう一つ新規ウィンドウで立ち上げて、コマンド lsof などを実行。)
そもそも kill すべき既に起動しているプロセスがみつからないのです。
($ ruby ex1.rb を実行中は、ターミナルをもう一つ新規ウィンドウで立ち上げて、コマンド lsof などを実行。)
そもそも kill すべき既に起動しているプロセスがみつからないのです。
Ruby のバージョンは
・2.0.0-p.195
・1.8.7-p.358
の2通りでも同じでした。
そこで、別の Mac で実行してみると、なんと警告が出ません!
・OS X Mountain Lion(10.8.4)
・OS X Lion(10.7.5)
・Ruby 2.0.0-p.195
・Ruby 1.8.7-p.358
すべての組み合わせで警告が出ませんでした。
な〜んだ

ということは、私のMacBook Air 固有の問題のようです。
そこで、 OS X 10.8.4 をクリーンインストールし直して、新規ユーザーアカウントを作ってみました。
ところが、それでも同じ警告が出ます!
ということは、自分のMac のハードウェア側の問題でしょうか?
でも、
・NVRAM(PRAM)のリセット
・SMC のリセット
を実行しましたが、それでも症状は変わりません。
------------------------------------------------------------------------------
------------------------------------------------------------------------------
ちなみに、
・[ruby-trunk - Bug #7100][Open] WEBrick/HTTPServer.new で BindAddress を指定しない場合に必ず警告が記録される - Ruby Forum
を参考にした改善策は見つかりました。
根本的解決策ではありませんが、
:BindAddress を指定する方法です。
:BindAddress => '0.0.0.0' または '::'
つまり、
WEBrick::HTTPServer.new( :Port => 8099, :BindAddress => '0.0.0.0', :DocumentRoot => '.' )
のようにすると警告が出なくなります。
・[ruby-trunk - Bug #7100][Open] WEBrick/HTTPServer.new で BindAddress を指定しない場合に必ず警告が記録される - Ruby Forum
を参考にした改善策は見つかりました。
根本的解決策ではありませんが、
:BindAddress を指定する方法です。
:BindAddress => '0.0.0.0' または '::'
つまり、
WEBrick::HTTPServer.new( :Port => 8099, :BindAddress => '0.0.0.0', :DocumentRoot => '.' )
のようにすると警告が出なくなります。
ただし、その際のウェブサーバーの挙動が少し違ったものになるのが気になります。
------------------------------------------------------------------------------
# ファイル名 ex2.rb
require 'webrick'
server = WEBrick::HTTPServer.new( :Port => 8099, :BindAddress => '0.0.0.0', :DocumentRoot => '.' )
trap(:INT) do
server.shutdown
end
server.start
------------------------------------------------------------------------------
------------------------------------------------------------------------------
# ファイル名 ex3.rb
require 'webrick'
server = WEBrick::HTTPServer.new( :Port => 8099, :BindAddress => '::', :DocumentRoot => '.' )
trap(:INT) do
server.shutdown
end
server.start
------------------------------------------------------------------------------
それぞれの実行結果は;
それぞれの実行結果は;
$ ruby ex1.rb
[2013-06-13 13:28:30] INFO WEBrick 1.3.1
[2013-06-13 13:28:30] INFO ruby 2.0.0 (2013-05-14) [x86_64-darwin12.3.0]
[2013-06-13 13:28:30] WARN TCPServer Error: Address already in use - bind(2)
[2013-06-13 13:28:30] INFO WEBrick::HTTPServer#start: pid=3667 port=8099
(以下略)$ lsof | grep IPv4
NetworkBr 3204 user0 5u IPv4 0xc3f8aed7b209dad5 0t0 UDP *:*
SystemUIS 3205 user0 5u IPv4 0xc3f8aed7b14ff22d 0t0 UDP *:*
$ lsof | grep IPv6
ruby 3667 user0 9u IPv6 0xc3f8aed7adf4c18d 0t0 TCP *:8099 (LISTEN)
------------------------------------------------------------------------------
$ lsof | grep IPv6
------------------------------------------------------------------------------
$ ruby ex2.rb
[2013-06-13 13:32:08] INFO WEBrick 1.3.1
[2013-06-13 13:32:08] INFO ruby 2.0.0 (2013-05-14) [x86_64-darwin12.3.0]
[2013-06-13 13:32:08] INFO WEBrick::HTTPServer#start: pid=3730 port=8099
(以下略)$ lsof | grep IPv4
NetworkBr 3204 user0 5u IPv4 0xc3f8aed7b209dad5 0t0 UDP *:*
SystemUIS 3205 user0 5u IPv4 0xc3f8aed7b14ff22d 0t0 UDP *:*
ruby 3730 user0 9u IPv4 0xc3f8aed7b2831935 0t0 TCP *:8099 (LISTEN)
$ lsof | grep IPv6
------------------------------------------------------------------------------
$ ruby ex3.rb
[2013-06-13 15:09:27] INFO WEBrick 1.3.1
[2013-06-13 15:09:27] INFO ruby 2.0.0 (2013-05-14) [x86_64-darwin12.3.0]
[2013-06-13 15:09:27] INFO WEBrick::HTTPServer#start: pid=3834 port=8099
(以下略)$ lsof | grep IPv4
NetworkBr 3204 user0 5u IPv4 0xc3f8aed7b209dad5 0t0 UDP *:*
SystemUIS 3205 user0 5u IPv4 0xc3f8aed7b14ff22d 0t0 UDP *:*
$ lsof | grep IPv6
ruby 3834 user0 9u IPv6 0xc3f8aed7adf4c18d 0t0 TCP *:8099 (LISTEN)
------------------------------------------------------------------------------
つまり、
◯ :BindAddress => nil(設定なし)
WARN TCPServer Error: Address already in use - bind(2)
IP4;×
IP6;○
◯ :BindAddress => '0.0.0.0'
(警告なし)
つまり、
◯ :BindAddress => nil(設定なし)
WARN TCPServer Error: Address already in use - bind(2)
IP4;×
IP6;○
◯ :BindAddress => '0.0.0.0'
(警告なし)
IP4;○
IP6;×
◯ :BindAddress => '::'
(警告なし)
となります。Rubyのバージョンも関係ありません。
ちなみに、他の Mac では全て警告なしで動きます。
その時の挙動は;
:BindAddress => nil(設定なし)
にしたときの挙動が違いますねぇ。
◯ :BindAddress => '::'
(警告なし)
IP4;×
IP6;○となります。Rubyのバージョンも関係ありません。
ちなみに、他の Mac では全て警告なしで動きます。
その時の挙動は;
◯ :BindAddress => nil(設定なし)
(警告なし)
IP4;○
IP6;○
◯ :BindAddress => '0.0.0.0'
(警告なし)
IP4;○
IP6;×
◯ :BindAddress => '::'
(警告なし)
IP4;×
IP6;○
となります。これも、Rubyのバージョンも関係ありません。
:BindAddress => nil(設定なし)
にしたときの挙動が違いますねぇ。

もう、完全に私にはお手上げです!
どなたか、解決法があればご教示ください。









)


)






)


。

。








ちょっと高いなぁ









