0

我已经使用 grep 尝试了各种过滤器来尝试解决这个问题,但就是无法破解它。

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 进程,有人可以提供任何建议或更可靠的方法吗?

4

3 回答 3

0

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

ps您可以通过提供和选项来选择进程来避免 grep 混乱。例如,-C按名称选择进程。与ps -C firefox-bin您一起获得的只有 Firefox 进程。但是,当有多个进程时,这根本没有帮助。

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

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

)。

对于三重记录,你必须想出一个解决方案,应该发生什么,在哪里运行不止一个。在具有线程化程序的多用户环境中,总会出现一种情况不止一个进程。有许多可能的解决方案没有人可以帮助您,正如您没有说的那样,您将如何处理它。可以考虑这样的解决方案,例如仅从一个用户中选择,并且仅从具有最低 pid 的用户中选择,或者在组的情况下选择进程领导者,以更改封闭的 bash 脚本以使用循环来处理多个值或使其当 ps 返回多个结果时,工作方式有所不同。

于 2012-08-27T05:46:16.843 回答
0

我无法重现该问题,但为了帮助您调试,请尝试在您的 awk 命令中打印 $11,这将告诉您它正在谈论什么进程

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

于 2012-08-27T05:47:19.673 回答
0

这实际上是对输出显示的简单修复;在您的echo语句中,将变量用双引号括起来:

echo -e "$cpumem"

如果不使用双引号,则不会通过将换行符转换为单空格(或空值)来保留换行符。使用引号,输出时保留变量的原始文本。

如果您的输出包含多个进程(即 - 多行),这意味着您grep实际匹配的多行。有可能正在运行子进程firefox-bin,也许是插件/容器?使用ps aux,该11th列将告诉您实际过程是什么,因此您可以将您的更新awk为以下(用于调试):

awk '{printf $3 "\t" $4 "\t" $11}'
于 2012-08-27T06:02:50.077 回答