On Sun, Sep 7, 2008 at 12:42 AM, ara.t.howard <ara.t.howard / gmail.com> wrote:
> On Sep 6, 2008, at 3:43 AM, Mikel Lindsaar wrote:
>> Hello all,
>> I am having some (un)fun with timing out a database calls.
> try this:
>       <snip>
>       pid = Process.pid
>       signaler = IO.popen "ruby -e'sleep #{ seconds };
>       Process.kill(:TERM.to_s, #{ pid }) rescue nil'"
>       thread = Thread.current
>       handler = Signal.trap('TERM'){ thread.raise Error, seconds.to_s }
>       begin
>         block.call
>       ensure
>         Process.kill 'TERM', signaler.pid rescue nil
>         Signal.trap('TERM', handler)
>       end

Ara, thank you _so_ much for this.

I would never have thought of spawning suicidal terminator ruby
processes to nuke my process :)  But works well.

There was a bit of delay (putting out some fires here over the past
two days) but I got to your code last night and this morning, and it
basically works... except it doesn't kill off the signaler threads
fully.

This is because two processes get made, first is the shell which then
creates the ruby -e "sleep..." blah thread.

The 'hack' I used to solve this is to replace the ensure block with:

      ensure
        Process.kill 'TERM', signaler.pid rescue nil
        Process.kill('TERM', signaler.pid+1) rescue nil
        Signal.trap('TERM', handler)
      end

But this obviously is insane as it assumes that no other processes get
started on the computer between sh starting up and it firing off the
ruby process.

the ps output looks like this:

$ ps -ef | grep ruby
rails     2153 2152 69 17:04 /usr/sbin/ruby1.8 /usr/bin/rake update:all
rails     2237 2153 69 17:04 sh -c ruby -e'sleep 40.0;?
Process.kill(:TERM.to_s, 2153) rescue nil'
rails     2238 2237 69 17:04 ruby -e'sleep 40.0;?
Process.kill(:TERM.to_s, 2153) rescue nil'

Any ideas on how to reliably find the PID of the ruby process that the
sh process created by IO.popen creates?


Mikel


-- 
http://lindsaar.net/
Rails, RSpec and Life blog....