class Procps::PS

By default it loads only base columns. To load extra columns require procps/ps/extra_columns after the gem is loaded.

You can also define custom columns with the Procps::PS.define_column method.

Constants

Address
Address_10
Address_16
DEFAULT_BIN_PATH
DEFAULT_COLUMNS

Attributes

bin_path[RW]
modifiers[RW]
options[RW]

Public Class Methods

alias_column(new_name, old_name) click to toggle source

Creates an alias to a column

# File lib/procps/ps.rb, line 25
def self.alias_column(new_name, old_name)
  columns[new_name.to_sym] = old_name.to_sym
end
columns() click to toggle source
# File lib/procps/ps.rb, line 13
def self.columns
  @@columns ||= {}
end
define_column(name, header = nil, cast = nil, &cast_block) click to toggle source

Define a column (see base columns in lib/procps/ps/base_columns.rb and extra columns in lib/procps/ps/extra_columns.rb)

# File lib/procps/ps.rb, line 19
def self.define_column(name, header = nil, cast = nil, &cast_block)
  header ||= name.to_s.upcase
  columns[name.downcase.to_sym] = Column.new(header, cast, &cast_block)
end
new(bin_path = nil) click to toggle source

Creates a Procps::PS object. Takes an argument with a bin path to ps command.

# File lib/procps/ps.rb, line 32
def initialize(bin_path = nil)
  @bin_path  = bin_path || DEFAULT_BIN_PATH
  @options   = { o: [] }
  @modifiers = Set.new
end

Public Instance Methods

columns() click to toggle source

List requested column objects with a typecast.

# File lib/procps/ps.rb, line 135
def columns
  @columns ||= @options[:o].map(&@@columns)
end
limit(n) click to toggle source

Limit processes list size

# File lib/procps/ps.rb, line 92
def limit(n)
  @limit = n
  self
end
load(force = false) click to toggle source

Executes a ps command & sets a result.

# File lib/procps/ps.rb, line 127
def load(force = false)
  reset if force
  @result ||= exec_command
end
Also aliased as: to_a
reset() click to toggle source

Reset a result

# File lib/procps/ps.rb, line 121
def reset
  @result = nil
  self
end
select(*columns) click to toggle source

Select columns to list with ps command

# File lib/procps/ps.rb, line 39
def select(*columns)
  columns.each do |col|
    unless @@columns.include?(col)
      raise ArgumentError, "unknown column :#{col}, please add it manually to Procps::PS.columns."
    end

    @options[:o] << col
  end
  self
end
sort(*orders) click to toggle source

Set sorting option. Doesn't supported by an original OSX ps (use with_args() method instead).

Example:

Procps::PS.new.select(:pid, :rss).sort("ppid", "-rss").to_a
# File lib/procps/ps.rb, line 115
def sort(*orders)
  (@options[:sort] ||= []).concat(orders)
  self
end
sum() click to toggle source

Sum a CPU time for parent proccesses

# File lib/procps/ps.rb, line 86
def sum
  @modifiers << "S"
  self
end
take(n = 1) click to toggle source

Limit processes list size & get result

# File lib/procps/ps.rb, line 98
def take(n = 1)
  limit(n).to_a
end
to_a(force = false)
Alias for: load
where( command: nil, group: nil, user: nil, pid: nil, ppid: nil, sid: nil, tty: nil, real_group: nil, real_user: nil ) click to toggle source

Filter processes list with conditions

Available options:

  • :command

  • :group

  • :user

  • :pid

  • :ppid

  • :sid

  • :tty

  • :real_group

  • :real_user

# File lib/procps/ps.rb, line 62
def where(
    command: nil,
    group: nil,
    user: nil,
    pid: nil,
    ppid: nil,
    sid: nil,
    tty: nil,
    real_group: nil,
    real_user: nil
  )
  @options[:C]    = Array(command)    if command
  @options[:g]    = Array(group)      if group
  @options[:u]    = Array(user)       if user
  @options[:p]    = Array(pid)        if pid
  @options[:ppid] = Array(ppid)       if ppid
  @options[:s]    = Array(sid)        if sid
  @options[:t]    = Array(tty)        if tty
  @options[:G]    = Array(real_group) if real_group
  @options[:U]    = Array(real_user)  if real_user
  self
end
with_args(**args) click to toggle source

Takes a hash of options to set custom ps arguments.

Example:

Procps::PS.new.select(:pid, :rss).with_args(m: true).to_a
# File lib/procps/ps.rb, line 106
def with_args(**args)
  @options.merge!(args)
  self
end

Private Instance Methods

exec_command() click to toggle source
# File lib/procps/ps.rb, line 148
def exec_command
  headers, *rows = IO.popen(to_command, "r") do |io|
    io.readlines
  end

  rows.replace(rows.take(@limit)) if @limit

  # headers = headers.split(/\s+/, columns.size)
  rows.map! do |row|
    parse_result_row(row)
  end
end
parse_result_row(row) click to toggle source
# File lib/procps/ps.rb, line 161
def parse_result_row(row)
  process = {}
  row.strip.split(/\s+/, columns.size).each_with_index do |col, i|
    process[@options[:o][i]] = columns[i].(col)
  end
  process
end
to_command() click to toggle source
# File lib/procps/ps.rb, line 141
def to_command
  @command ||= begin
    @options[:o].concat(DEFAULT_COLUMNS) unless @options[:o].size > 0
    CommandBuilder.new(self).call
  end
end