On Thu, 26 Aug 2004, George Mochrie wrote: > hi > > A quick question: > > Is there an easy way to check if a process is running given it's PID? There > seems to be nothing like Process.exists?(pid). If I was root I could use > Process.kill(0,pid) to test, but the program needs to run as a plain user. Do > I have to parse the output from ps -e? > > Thanks in advance :) > -- > George Mochrie > aka Drasil > ICQ# 84423409 from my util module: def alive? pid #{{{ pid = Integer("#{ pid }") begin Process.kill 0, pid true rescue Errno::ESRCH false end #}}} end the module require 'pathname' require 'socket' module Util #{{{ class << self def export sym #{{{ sym = "#{ sym }".intern module_function sym public sym #}}} end def append_features c #{{{ super c.extend Util #}}} end end def mcp obj #{{{ Marshal.load(Marshal.dump(obj)) #}}} end export 'mcp' def klass #{{{ self.class #}}} end export 'klass' def realpath path #{{{ path = File.expand_path "#{ path }" begin Pathname.new(path).realpath.to_s rescue Errno::ENOENT, Errno::ENOTDIR path end #}}} end export 'realpath' def hashify(*hashes) #{{{ hashes.inject(accum={}){|accum,hash| accum.update hash} #}}} end export 'hashify' def getopt opt, hash #{{{ opt_s = "#{ opt }" hash[opt] || hash[opt_s] || hash[opt_s.intern] #}}} end export 'getopt' def alive? pid #{{{ pid = Integer("#{ pid }") begin Process.kill 0, pid true rescue Errno::ESRCH false end #}}} end export 'alive?' def maim(pid, opts = {}) #{{{ sigs = getopt('signals', opts) || %w(SIGTERM SIGQUIT SIGKILL) suspend = getopt('suspend', opts) || 4 pid = Integer("#{ pid }") sigs.each do |sig| begin Process.kill(sig, pid) rescue Errno::ESRCH return nil end sleep 0.2 unless alive?(pid) break else sleep suspend end end not alive?(pid) #}}} end export 'maim' def timestamp time = Time.now #{{{ usec = "#{ time.usec }" usec << ('0' * (6 - usec.size)) if usec.size < 6 time.strftime('%Y-%m-%d %H:%M:%S.') << usec #}}} end export 'timestamp' def stamptime string, local = true #{{{ string = "#{ string }" pat = %r/^\s*(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d).(\d\d\d\d\d\d)\s*$/o match = pat.match string raise ArgumentError, "<#{ string.inspect }>" unless match yyyy,mm,dd,h,m,s,u = match.to_a[1..-1].map{|m| m.to_i} if local Time.local yyyy,mm,dd,h,m,s,u else Time.gm yyyy,mm,dd,h,m,s,u end #}}} end export 'stamptime' def escape! s, char, esc #{{{ re = %r/([#{0x5c.chr << esc}]*)#{char}/ s.gsub!(re) do (($1.size % 2 == 0) ? ($1 << esc) : $1) + char end #}}} end export 'escape!' def escape s, char, esc #{{{ ss = "#{ s }" escape! ss, char, esc ss #}}} end export 'escape' def fork(*args, &block) #{{{ begin verbose = $VERBOSE $VERBOSE = nil Process.fork(*args, &block) ensure $VERBOSE = verbose end #}}} end export 'fork' def exec(*args, &block) #{{{ begin verbose = $VERBOSE $VERBOSE = nil Kernel.exec(*args, &block) ensure $VERBOSE = verbose end #}}} end export 'exec' def hostname #{{{ @__hostname__ ||= Socket::gethostname #}}} end export 'hostname' def host #{{{ @__host__ ||= Socket::gethostname.gsub(%r/\..*$/o,'') #}}} end export 'host' def emsg e #{{{ "<#{ e.class }> - <#{ e.message }>" #}}} end export 'emsg' def btrace e #{{{ (e.backtrace or []).join("\n") #}}} end export 'btrace' def errmsg e #{{{ emsg(e) << "\n" << btrace(e) #}}} end export 'errmsg' def erreq a, b #{{{ a.class == b.class and a.message == b.message and a.backtrace == b.backtrace #}}} end export 'erreq' #}}} end # class Util regards -a -- =============================================================================== | EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov | PHONE :: 303.497.6469 | A flower falls, even though we love it; | and a weed grows, even though we do not love it. | --Dogen ===============================================================================