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