From: Joe Van Dyk Date: 2005-06-25T11:12:34+09:00 Subject: Re: launching process and keeping track of pid On 6/24/05, Ara.T.Howard 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