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

标签 ruby process

是否有 ruby​​ 方法来获取进程启动时间? shell 中类似以下内容:

 $ 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 上,返回一个整数,它对应于自引导以来的 jiffies 数。不幸的是,您需要使用 sysconf 系统调用来获取 ms/jiffy 的数量。此系统调用不能直接在 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

最佳答案

有一个 gem 可以做到这一点:sys-proctable

它解析/proc中的文件

安装 gem

gem install sys-proctable

需要 gem

require 'sys/proctable'
include Sys

对于所有进程

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

仅针对单个进程(如您的示例)

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

如果你不想使用 gem,也许你可以从 the source 中提取他们如何解析 /proc 文件的部分。

编辑:

我误读了您确实知道如何解析/proc 文件的部分。但也许 gem 仍然对您有用,使其便于携带等等。

关于用于获取进程开始时间的 Ruby 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017414/

相关文章:

java - 将unix进程转换为java中的常规进程

ruby-on-rails - 有没有办法使用 ruby​​ gem aws-s3 从 s3 下载文件?

ruby - 是否可以使用 Rspec 为无限循环问题编写规范?,Ruby

mysql - heroku rake 数据库 :migrate ERROR "gem install activerecord-mysql-adapter"

java - 应用程序为 "Force Closed"时是否有任何关闭 Hook ?

c# - 性能计数器实例名称与进程名称

Android:子进程(logcat)在父进程(app)死后继续运行

javascript - 使用 cryptojs 解密不起作用

ruby - 正则表达式 *仅* 当它们包含在开始/结束括号之间时替换子字符串出现

c - 如何在不执行 exec 系列函数的情况下更改子进程名称?