在linux上,Top程序从ruby返回的值比bash少

在linux上,Top程序从ruby返回的值比bash少,ruby,linux,bash,shell,Ruby,Linux,Bash,Shell,我正试图将top的结果合并到一个ruby程序中。但是,当在ruby的子shell中调用top时,其行为与直接在shell中运行时不同。具体来说,当从ruby运行时,它排除了许多结果 例如,在bash中运行top-bn1 | wc-l,返回“133”。使用backticks从irb运行相同的命令返回“17” 为什么从shell调用top和从子shell调用top有区别?如何在ruby脚本中获得top的完整输出 笔记 我正在运行Ubuntu12.04.1LTS(精确版)。这个问题不会发生在MacOS

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

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

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

笔记 我正在运行Ubuntu12.04.1LTS(精确版)。这个问题不会发生在MacOSX上,它提供了完全不同的top版本

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


我知道ps返回的许多统计数据与top相同,但我特别感兴趣的是top对CPU使用率的估计,计算方法不同

显然,
top
在ruby中运行时,考虑到终端的大小。我打赌你的终端尺寸是17线高。尝试删除环境哈希中的行条目:

$ 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

它可能有助于将
ENV['COLUMNS']
调整为像
'10000'
这样的大数字。是的,终端大小是个问题。谢谢