Joe Van Dyk
6/25/2005 2:13:00 AM
On 6/24/05, Ara.T.Howard <Ara.T.Howard@noaa.gov> wrote:
> On Sat, 25 Jun 2005, Joe Van Dyk wrote:
>
> > Hi,
> >
> > How can I launch a program from Ruby and monitor it to see if it's
> > running? On a unix platform.
> >
> > I assume I'd probably need to launch the program, capture the pid of
> > the started process somehow, and start a thread that monitors the
> > /proc directory to see if the pid is in there?
> >
> > Thanks,
> > Joe
>
> this might be helpful:
>
> #
> # returns true if pid is running, false otherwise
> #
> def alive pid
> #--{{{
> pid = Integer("#{ pid }")
> begin
> Process::kill 0, pid
> true
> rescue Errno::ESRCH
> false
> end
> #--}}}
> end
> alias alive? alive
>
Thanks!
I asked a question similar to this a couple months ago and you
responded with the following code. However, my Ruby-fu isn't strong
enough to decipher it (the optfilter and IO bit). Any chance you
could add some comments to it?
class BackGroundProcess
attr :argv
attr :opts
attr :pid
def initialize(*args)
@argv, @opts = optfilter args
return if((@pid = fork))
perform_redirects
exec(*@argv)
end
def perform_redirects
if((io = (opts[:stdout] or opts['stdout'])))
STDOUT.reopen(IO === io ? io : open(io,'w'))
end
if((io = (opts[:stderr] or opts['stderr'])))
STDERR.reopen(IO === io ? io : open(io,'w'))
end
end
def optfilter list
hashes, args = list.partition{|elem| Hash === elem}
opts = hashes.inject(accum={}){|accum, h| accum.update h}
[ args, opts ]
end
end