3

プロセスの開始時間を取得するルビーメソッドはありますか? シェルで次のようなもの:

 $ ps -p $$ -o lstart
 STARTED
 Thu Oct 18 11:49:22 2012

ps 出力の解析を避けたいと思っていました。また、情報を取得するために Linux で /proc/self/status を解析する方法は知っていますが、より移植性の高いソリューションを望んでいました。

更新: これを行うポータブルな方法は、まさに私が望んでいたものです。私は sys/proctable を使用し、次の行を使用して必要なものを取得しました。

ProcTable.ps($$).starttime

ありがとう、コーエン。

更新: これを少しいじってみたところ、思ったほど移植性がないことがわかりました。Darwin では、Time オブジェクトが返されます。Linux では、起動後の jiffy の数に対応する整数が返されます。残念ながら、ms/jiffy の数を取得するには、sysconf syscall を使用する必要があります。この syscall は ruby​​ では直接利用できません。Linuxでprocの開始時間を取得するために次を使用しました。

module LinuxCLib
  extend FFI::Library
  ffi_lib 'c'

  @@cg = FFI::ConstGenerator.new(nil, :required => true) do |gen|
    gen.include('unistd.h')
    gen.const(:_SC_CLK_TCK)
  end

  attach_function :sysconf, [:int], :long

  def self.hz
    self.sysconf(@@cg["_SC_CLK_TCK"].to_i)
  end
end

def self.get_proc_starttime
  proc_jiffies_since_boot_starttime = Sys::ProcTable.ps($$).starttime
  stat_lines = File.open("/proc/stat").readlines
  system_s_since_epoch_boottime = catch(:boottime) do
    stat_lines.each do |line|
      split_line = line.split
      throw :boottime, split_line[1].to_i if split_line[0] == "btime"
    end
    nil
  end
  proc_s_since_epoch_starttime = (
      proc_jiffies_since_boot_starttime/LinuxCLib::hz + system_s_since_epoch_boottime)
  Time.at(proc_s_since_epoch_starttime)
end
4

1 に答える 1

2

それを行うことができるgemがあります:sys-proctable

ファイルを解析します/proc

ジェムをインストールする

gem install sys-proctable

ジェムが必要

require 'sys/proctable'
include Sys

すべてのプロセスに

ProcTable.ps{ |p|
    puts p.comm
    puts p.starttime
}

単一のプロセスのみ(例のように)

p = ProcTable.ps($$)
puts p.inspect

また、gem を使用したくない場合は、ソース/procからファイルを解析する方法の一部を抽出できます。

編集:

ファイルの解析方法を知っているという部分を読み間違えました。/procしかし、宝石はまだあなたに役立つ可能性があり、ポータブルにすることができます.

于 2012-10-22T18:42:32.563 に答える