タイムアウト処理追加

atpagesサーバのCGIプログラムlimit制限

以下のスクリプトを動かしてatpagesサーバのlimit値を表示させてみた

#!/usr/local/bin/ruby

puts <<EOH
Content-type: text/html


<html>
<head></head>
<body>
EOH
puts Process.getrlimit(Process::RLIMIT_CORE)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_CPU)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_DATA)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_FSIZE)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_NOFILE)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_STACK)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_AS)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_MEMLOCK)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_NPROC)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_RSS)[0].to_s + '<br>'
puts Process.getrlimit(Process::RLIMIT_SBSIZE)[0].to_s + '<br>'

puts <<EOH
</body></html>
EOH

結果は

9223372036854775807
10
1073741824
9223372036854775807
14745
134217728
10000000
9223372036854775807
5547
9223372036854775807
9223372036854775807

こんな感じで一プロセスあたり10秒の制限があるようだ

このため多くのURLが貼られると処理が終わらず表示ができずにいた
根本的な解決にはならないが(実際今でも表示できないことがある)1レス当たりの処理時間を最大2秒となるようにタイムアウト処理を追加してみた
タイムアウト処理の書き方はこんな感じ

begin
timeout(2) {
  yourfunc
}
rescue Timeout::Error
  rescuefunc
end