1

我正在尝试将 top 的结果合并到一个 ruby​​ 程序中。但是当在 ruby​​ 的子 shell 中调用时,top 的行为与直接在 shell 中运行时不同。具体来说,当从 ruby​​ 运行时,它会排除许多结果。

例如,top -bn1 | wc -l在 bash 中运行会返回“133”。使用反引号从 irb 运行相同的命令会返回“17”。

为什么从 shell 调用 top 和从子 shell 调用有区别?如何在 ruby​​ 脚本中获得 top 的完整输出?

笔记

我正在运行 Ubuntu 12.04.1 LTS(精确)。这个问题不会出现在 mac OS X 上,它提供了完全不同的 top 版本。

使用“-d”延迟标志似乎并没有改变行为。也不会增加迭代次数。

我知道 ps 返回许多与 top 相同的统计信息,但我对 top 对 CPU 使用率的估计特别感兴趣,它的计算方式不同。

4

1 回答 1

3

显然,top在 ruby​​ 中运行时尊重终端的大小。我敢打赌你的终端尺寸是 17 行高。尝试删除 ENV 哈希中的 LINES 条目:

$ irb
irb(main):001:0> %x{top -bn1 | wc -l}
=> "36\n"
irb(main):002:0> ENV.delete 'LINES'
=> "36"
irb(main):003:0> %x{top -bn1 | wc -l}
=> "169\n"

如果你想知道有多少进程正在运行,你可以从 ruby​​ 编写:

num = Dir.glob('/proc/*').select {|d| File.directory? d and d.match(/\/\d+$/)}.length

对于 CPU 使用率,也许:

idle = %x{vmstat 1 2}.split[-2].to_i
usage = 100 - idle
于 2013-01-04T22:25:04.353 回答