2012-08-27 63 views
0

我尝试了各种使用grep的过滤器来尝试解决这个问题,但却无法破解它。与命令行不同的Bash输出

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}' 

我提取用于处理的CPU和内存使用,当我在命令行运行它,我得到的2个字段正确输出:

ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}' 
> 1.1 4.4 

但相同的命令从内执行该bash脚本产生这样的:

cpumem="$(ps aux | grep -v 'grep' | grep 'firefox-bin' | awk '{printf $3 "\t" $4}')" 
echo -e cpumem 
> 1.1 4.40.0 0.10.0 0.0 

我猜测它正在拿起3条记录,但我只是不知道从哪里来。

我通过使用grep -v'grep'过滤掉任何其他grep进程,有人可以提供任何建议或更可靠的方法吗?

+0

您可以通过改变消除了第一个'grep'需要第二个到'grep'[f] irefox-bin'';它的模式不符合它自己。此外,只需用逗号替换“\ t”,因为该选项卡在被$(...)'捕获后将转换为单个空格。 – chepner

回答

0

也许你有3条记录,因为3个firefox正在运行(或一个正在运行,并且它本身是线程)。

您可以通过提供ps和选择进程来避免grep hazzle。例如。 -C按名称选择进程。使用ps -C firefox-bin您只能获得firefox进程。但是,如果存在多个流程,这根本无济于事。

(你也可以使用ps选项输出只有你想要的列,所以你的行会像

ps -C less --no-headers -o %cpu,%mem 

)。

对于三重记录,您必须提出一个解决方案,应该发生什么情况,哪里有多个正在运行。在具有线程的程序的多用户环境中,总是存在您有多种类型的进程的情况。有很多可能的解决方案,没有人可以帮助你,就像你不会说的那样,你会用它来做。人们可以想到像只从一个用户那里选择的解决方案,并且只有具有最低pid的那个,或者在组的情况下是过程领导者,才能将封闭的bash脚本更改为使用循环来处理多个值或使其成为当ps返回多个结果时,以某种方式工作不同。

+0

非常感谢大家,只有1个firefox实例在运行。我使用了下面的代码:cpumem = $(ps -C $ PROC --no-headers -o%cpu,%mem)现在似乎工作。再次感谢。 – crankshaft

+0

请注意,'-C'在'ps'的BSD版本中有不同的含义。 – chepner

0

我是无法重现的问题,而是帮你调试,尝试在你的awk命令打印$ 11,会告诉你什么处理它在谈论

cpumem =“$(的ps aux | grep的-v'grep'| grep'firefox-bin'| awk'{printf $ 3'\ t“$ 4”\ t“$ 11”\ n“}')” echo -e cpumem

0

它实际上是一个简单的修复用于输出显示;在你echo声明,包裹在双引号的变量:

echo -e "$cpumem" 

不使用双引号,换行不会将它们转换为单空格(或空值)保存。用引号,变量的原始文本在输出时被保留。

如果您的输出包含多个进程(即 - 多行),这意味着您的grep实际上匹配了多行。有一个孩子进程运行的机会是firefox-bin,也许是一个插件/容器?随着ps aux,该11th栏会告诉你实际的过程是什么,这样你就可以更新你的awk为以下(调试):

awk '{printf $3 "\t" $4 "\t" $11}'