繁体   English   中英

Ruby方法来获取进程的开始时间?

[英]Ruby method for getting a process's start time?

是否有红宝石方法来获取流程开始时间? Shell中的内容如下:

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

我希望避免解析ps输出。 另外,我知道如何在linux上解析/ proc / self / status以获得信息,但是我希望有一个更可移植的解决方案。

更新:便携式方法正是我想要的。 我使用sys / proctable并使用以下行来获取所需的内容:

ProcTable.ps($$).starttime

谢谢,科恩

更新:我对此进行了一些尝试,发现它不像我想象的那样可移植。 在达尔文上,将返回一个Time对象。 在Linux上,将返回一个整数,该整数与自启动以来的jiffies数量相对应。 不幸的是,您需要使用sysconf syscall来获取ms / jiffy的数量。 无法直接在ruby上使用此syscall。 我使用以下命令获取proc在Linux上的启动时间:

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

有一个宝石可以做到这一点: 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文件的部分。 但是也许宝石仍然可以为您使用,使其易于携带等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM