以前の記事とほぼ同内容なんだけど,またはまってしまった.覚えられるまで何度でも書く. 24時間稼働させているrubyのプログラムが全く出力を吐かなくなった.process自体は落ちずに生き残っているらしい.straceで確認するとppollで止まっている.
% strace -p 5968 Process 5968 attached ppoll([{fd=8, events=POLLIN}], 1, NULL, NULL,
ppollの第2引数がNULLになっているのが良くない.これはTimeout時間をしているものでNULLならばTimeoutなしの無限待ちになる. RubyのHTTPのget,postでdefaultでTimeoutが設定されていないのが大本.以下のように明示的に指定する.
url = URI.parse URL http = Net::HTTP.new(url.host,url.port) http.use_ssl = true if (443==url.port) http.open_timeout = 300 http.read_timeout = 300 http.ssl_timeout = 300 http.verify_mode = OpenSSL::SSL::VERIFY_PEER http.verify_depth = 5 resp = http.get(url.path)