こんな感じのエラーが出てログを圧迫する
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