PhantomJSとSelenium/Watirを使っているherokuでgit push heroku masterするとConnection refusedエラーが出てウザイ

こんな感じのエラーが出てログを圧迫する

Cycling のときや push のときに Connection refused - connect(2) for "127.0.0.1" port 8910 (Errno::ECONNREFUSED) というエラーが出ます(なおポート番号は違う場合もあります)。

Nov 29 22:29:40 app-test heroku/bot.1:  Stopping all processes with SIGTERM 
Nov 29 22:29:42 app-test app/bot.1:  /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:879:in `initialize': Connection refused - connect(2) for "127.0.0.1" port 8910 (Errno::ECONNREFUSED) 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:879:in `open' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:879:in `block in connect' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:91:in `block in timeout' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:101:in `call' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:101:in `timeout' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:878:in `connect' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:1447:in `begin_transport' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:1404:in `transport_request' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:1378:in `request' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:1128:in `get' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/phantomjs/service.rb:79:in `block in stop' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:853:in `start' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/ruby-2.1.5/lib/ruby/2.1.0/net/http.rb:583:in `start' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/phantomjs/service.rb:75:in `stop' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/phantomjs/service.rb:69:in `block in start' 
Nov 29 22:29:42 app-test app/bot.1:  	from /app/vendor/bundle/ruby/2.1.0/gems/selenium-webdriver-2.48.1/lib/selenium/webdriver/common/platform.rb:153:in `block in exit_hook' 
Nov 29 22:29:42 app-test heroku/bot.1:  Process exited with status 143 

トレース情報が長いのです…。
エラーは Selenium::WebDriver の終了時に出ていますので、スクリプト内に rescue 節を作っても捕捉出来ません。

対策

結論としては
「Signal.trap で SIGTERM を掴まえて Selenium::WebDriver を終了」
させます。その際にも同じく Errno::ECONNREFUSED エラーが出ることもありますが、そのエラーに関しては Signal.trap のブロックに rescue 節を作れば捕捉出来ます。
例示します。

require 'watir-webdriver'
$stdout.sync = true

selenium_driver = Selenium::WebDriver.for(:phantomjs)

Signal.trap(:TERM) do
  begin
    #@browser.quit
    selenium_driver.quit
    puts "エラー無く終了"
  rescue Errno::ECONNREFUSED => ex
    puts "#{ex.message} (#{ex.class})"
    puts "エラーあり終了"
  ensure
    exit
  end
end

@browser = Watir::Browser.new(selenium_driver)
@browser.goto('https://www.google.co.jp/')
puts @browser.title
loop { sleep 60 }

なお Signal.trap のブロックの最後には必ず exit を入れましょう。入れないと「Error R12」エラーが出ます。

heroku/bot.1:  Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM  
heroku/bot.1:  Stopping remaining processes with SIGKILL 
heroku/bot.1:  Process exited with status 137 

関連リンク:WatirでPhantomJSを使うときに出るエラー - 別館 子子子子子子(ねこのここねこ)