On 6/24/05, Ara.T.Howard <> wrote:
> On Sat, 25 Jun 2005, Joe Van Dyk wrote:
>=20
> > 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
>=20
> this might be helpful:
>=20
> #
> # returns true if pid is running, false otherwise
> #
> def alive pid
> #--{{{
> pid =3D Integer("#{ pid }")
> begin
> Process::kill 0, pid
> true
> rescue Errno::ESRCH
> false
> end
> #--}}}
> end
> alias alive? alive
>=20
Thanks!=20
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

pts
attr

id
def initialize(*args)
@argv, @opts =3D optfilter args
return if((@pid =3D fork))
perform_redirects
exec(*@argv)
end
def perform_redirects
if((io =3D (opts[:stdout] or opts['stdout'])))
STDOUT.reopen(IO =3D=3D=3D io ? io : open(io,'w'))
end
if((io =3D (opts[:stderr] or opts['stderr'])))
STDERR.reopen(IO =3D=3D=3D io ? io : open(io,'w'))
end
end
def optfilter list
hashes, args =3D list.partition{|elem| Hash =3D=3D=3D elem}
opts =3D hashes.inject(accum=3D{}){|accum, h| accum.update h}
[ args, opts ]
end
end