module Ziltoid::System

Constants

PS_FIELDS

The position of each field in ps output

Public Instance Methods

cpu_usage(pid, include_children = true) click to toggle source
# File lib/ziltoid/system.rb, line 42
def cpu_usage(pid, include_children = true)
  ps = ps_aux
  return unless ps[pid]
  cpu_used = ps[pid][:cpu].to_f

  get_children(pid).each do |child_pid|
    cpu_used += ps[child_pid][:cpu].to_f if ps[child_pid]
  end if include_children

  cpu_used
end
get_children(parent_pid) click to toggle source
# File lib/ziltoid/system.rb, line 66
def get_children(parent_pid)
  child_pids = []
  ps_aux.each_pair do |_pid, info|
    child_pids << info[:pid].to_i if info[:ppid].to_i == parent_pid.to_i
  end
  grand_children = child_pids.map { |pid| get_children(pid) }.flatten
  child_pids.concat grand_children
end
pid_alive?(pid) click to toggle source
# File lib/ziltoid/system.rb, line 10
def pid_alive?(pid)
  return false if pid.nil?
  begin
    ::Process.kill(0, pid)
    true
  rescue Errno::EPERM # no permission, but it is definitely alive
    true
  rescue Errno::ESRCH
    false
  end
end
ps_aux() click to toggle source
# File lib/ziltoid/system.rb, line 22
def ps_aux
  # BSD style ps invocation
  processes = `ps axo pid,ppid,pcpu,rss`.split("\n")

  processes.inject({}) do |result, process|
    info = process.split(/\s+/)
    info.delete_if { |p_info| p_info.strip.empty? }
    info.map! { |p_info| p_info.gsub(",", ".") }

    info = PS_FIELDS.each_with_index.inject({}) do |info_hash, (field, field_index)|
      info_hash[field] = info[field_index]
      info_hash
    end

    pid = info[:pid].strip.to_i
    result[pid] = info
    result
  end
end
ram_usage(pid, include_children = true) click to toggle source
# File lib/ziltoid/system.rb, line 54
def ram_usage(pid, include_children = true)
  ps = ps_aux
  return unless ps[pid]
  mem_used = ps[pid][:ram].to_i

  get_children(pid).each do |child_pid|
    mem_used += ps[child_pid][:ram].to_i if ps[child_pid]
  end if include_children

  mem_used
end