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
Public Class Methods
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
# File lib/procps/ps.rb, line 13 def self.columns @@columns ||= {} end
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
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
List requested column objects with a typecast.
# File lib/procps/ps.rb, line 135 def columns @columns ||= @options[:o].map(&@@columns) end
Limit processes list size
# File lib/procps/ps.rb, line 92 def limit(n) @limit = n self end
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
Reset a result
# File lib/procps/ps.rb, line 121 def reset @result = nil self end
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
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 a CPU time for parent proccesses
# File lib/procps/ps.rb, line 86 def sum @modifiers << "S" self end
Limit processes list size & get result
# File lib/procps/ps.rb, line 98 def take(n = 1) limit(n).to_a end
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
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
# 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
# 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
# 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