linux - 使用 top 命令捕获 COMMAND 过滤的进程的 %CPU 和 PID

标签 linux bash

我需要编写一个执行以下操作的 Bash 脚本:

  1. 在“top”命令中,我想通过给定的命令过滤进程。下面我以谷歌浏览器为例,它在COMMAND栏中显示为“chrome”。
  2. 过滤后,可能会剩下零个、一个或多个带有 COMMAND "chrome"的进程(这只是为了强调一般情况下不会只有一个带有 COMMAND "chrome"的进程)。
  3. 现在我想将当前时间 (hh:mm:ss)、进程的 PID 和为该进程显示的 %CPU 值写入文件“logfile”
  4. 每秒重复一次步骤 1 到 3。

示例:假设有三个“chrome”进程,“logfile”中的输出应如下所示(前三秒):

    17:49:12 7954 14.0
    17:49:12 7969  9.3
    17:49:12 2626  1.3
    17:49:13 7954 12.0
    17:49:13 7969  6.3
    17:49:13 2626  1.2
    17:49:14 7954 14.7
    17:49:14 7969  8.5
    17:49:14 2626  2.1

到目前为止我的想法:使用命令

    top -b -n 1 -p 7954 | tail -n 2 | head -n 2 | awk '{print $1, $9}' >> logfile

我通过 PID 过滤顶部(在本例中 PID == 7954),输出看起来像

    PID %CPU
    7954 6.6

但是(因为我实际上想通过 COMMAND 进行过滤)我不知道如何通过 COMMAND 进行过滤。在上面的行中,“-p 7954”对 PID==7954 进行过滤,但是我需要在这里写什么才能通过 COMMAND==chrome 进行过滤?另外,如何删除/避免 header ?

根据时间步长:我发现了命令

    date +"%T" 

以正确的格式 (hh:mm:ss) 给我时间。

所以我只是努力将这些部分组合在一起并解决上面提到的过滤问题。感谢您的帮助!

最佳答案

Awk 可以做到这一点; awk '/regex/{ print }' 仅在匹配 regex 的行上执行 print 操作。

但是,您也可以(或许也应该)包含 headtail:

top -b -n 1 | awk 'NR>1 && $10 == "chrome" {print strftime("%T"), $1, $9}' 

...假设 top 输出的第十个字段包含命令名称。

关于linux - 使用 top 命令捕获 COMMAND 过滤的进程的 %CPU 和 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059592/

相关文章:

从命令行传递字符串时的 Bash 怪癖

linux - 从文件名中删除单词列表

linux - 将 Mercurial 更改部署到网站托管帐户

php - 错误 : utf8_mime2text() has new signature, 但缺少 U8T_CANONICAL

linux - 在终端上进行大规模重命名并按顺序编号

c++ linux - 从IP获取接口(interface)

linux - 如何在 expect 中设置 bash 变量或将变量从 expect 返回到 bash

c++ - 防止在 keypress linux c++ 的控制台上写入

linux - for i in {00..03} 不适用于 nohup

bash - 来自模式的值(value) - bash