From: Hugh Sasse Date: 2007-03-14T19:41:25+09:00 Subject: Re: 1.8.6 timeut.rb segfault On Wed, 14 Mar 2007, Nobuyoshi Nakada wrote: > At Wed, 14 Mar 2007 03:40:42 +0900, > Hugh Sasse wrote in [ruby-core:10574]: > > I've just received this message from cron. > > > Your "cron" job on brains > > /usr/local/bin/erb /home/hgs/public_html/ruby/ruby_sites.eruby > > > /home/hgs/public_html/ruby/ruby_sites.html > > Can't you show reproducable code, or backtrace? Yes, but it's from an erb job run by cron, and that's all I got from cron It was working fine till I upgraded 12 7,18 * * * /usr/local/bin/erb /home/hgs/public_html/ruby/ruby_sites.eruby > /home/hgs/public_html/ruby/ruby_sites.html :r /home/hgs/public_html/ruby/ruby_sites.eruby List of Active Ruby Sites

List of active Ruby Sites

<% require 'net/http' require 'uri' require 'date' require 'timeout' # Get a list of sites to process class Site attr_accessor :url, :name, :date, :failed def initialize(url, name) @url = url; @name = name; @date = DateTime.now; @failed = false end end Sites = [Site.new('http://www.ruby-lang.org/', 'www.ruby-lang.org/'), Site.new('http://redhanded.hobix.com/', 'Redhanded'), Site.new('http://www.ruby-doc.org/', 'Ruby-doc'), Site.new('http://www.rubyquiz.com/', 'Ruby Quiz'), Site.new('http://rubyforge.org/', 'RubyForge'), Site.new('http://rubyxml.com/', 'Ruby XML'), Site.new('http://raa.ruby-lang.org/', 'Ruby Application Archive'), Site.new('http://www.rubygarden.org/', 'RubyGarden')] Sites.each {|site| uri = URI.parse(site.url) host = uri.host port = uri.port path = uri.path begin Timeout::timeout(300) { Net::HTTP.start(host, port) {|http| response = http.request_head(path) if response.key?('last-modified') site.date = DateTime.parse(response['last-modified']) else site.date = DateTime.civil(1970) end } } rescue Timeout::Error site.failed = true end } %>

Note, Dates of 1970 mean the server doesn't provide a Last-Modified: header.

Page generated <%= DateTime.now %> with erb

Running that command line by hand gives ... no errors now. Nothing like a live demonstration of a problem to make it disappear. OK can I make timeout fail anyway brains hgs 31 %> vim timeout_error.rb brains hgs 32 %> ./timeout_error.rb execution expired brains hgs 33 %> ./timeout_error.rb execution expired brains hgs 34 %> ./timeout_error.rb execution expired brains hgs 35 %> cat !$ cat ./timeout_error.rb #!/usr/local/bin/ruby -w require 'timeout' begin Timeout::timeout(3) { sleep 5 } rescue Timeout::Error => e puts e end brains hgs 36 %> Apparently not. :-( Any suggestions as to how I can make the failure more verbose next time so I can give you something you can use? If it fails again.... > > -- > Nobu Nakada > > Thank you, and apologies for the uselessness of this report. Hugh