使用单行命令获取 Linux 进程的实时 CPU 使用率并得到简单的结果

使用单行命令获取 Linux 进程的实时 CPU 使用率并得到简单的结果

我到处搜索,却一无所获。我试图创建一个小型仪表,显示 PID 指定的一个进程的 CPU 使用率。

我需要命令来打印一个简单的答案,因此 top -p $pid 不好用。该命令由 PHP 执行,需要立即打印响应。

与我需要的密切相关的事情是

sudo ps -p $pid -o %cpu

但经过进一步测试和搜索后,我发现这会打印自进程启动以来的平均使用情况。我需要从命令运行那一刻起的实际使用情况,就像它显示在顶部一样。

这可能吗?

编辑::

$cmd = 'sudo sh -c "top -n1 | awk \'/30100/ {print $9}\'"';
echo exec($cmd);

尝试不使用 shell

$cmd = "sudo top -n1 | awk '/30100/ {print $9}'";
echo exec($cmd);

仍然没有结果,它没有回应任何内容

答案1

好吧,我会从一个简单的方法开始,像这样:

$ top |grep %pid

在 ubuntu 12.04 上,每次更新 top 时它都会输出一次 PID 的行:

    username@usrver / $ top |grep 2593
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:25.38 chrome             
 2593 username   20   0 1103m 170m  16m S   28  2.2  67:26.24 chrome             
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:27.15 chrome             
 2593 username   20   0 1103m 170m  16m S   23  2.2  67:27.86 chrome             
 2593 username   20   0 1103m 170m  16m S   25  2.2  67:28.60 chrome

然后使用 awk 抓取第 10 个字段,虽然这里我们实际上不需要使用 grep。awk 可以对您的 PID 进行正则表达式处理,然后打印 CPU 值:

username@usrver / $ top | awk '/2593/ {print $10}'
25
29
30
32

答案2

虽然这个问题已经得到回答并被接受,但我认为它并不完整。接受的答案中缺少了几点。

  1. 如果您将 top 作为子进程运行并希望获取任何有意义的输出,则需要使用 -b 以批处理模式运行 top。否则,由于以交互模式运行,top 会包含混合的控制字符。

  2. 使用 -n 指定所需的迭代次数,否则将导致无限迭代,子进程将永远无法完成。您需要至少进行两次迭代,以便 top 有一个参考点来收集差异,即实际的 CPU 使用率。

  3. 使用 -d 指定迭代间隔。在大多数系统中,默认值为 3 秒。因此,如果您想要每秒使用量,则需要明确指定。

现在结合以上所有要点,你会得到

top -b -n 2 -d 1

由于我们有两次迭代,我们只需要考虑第二个输出。使用 awk 获取第二个输出,该输出以字符串开头顶部

top -b -n 2 -d 1 | awk '/^top/{i++}i==2'

现在让我们过滤掉 PID,比如 2593,并打印第 9 列,其中包含 CPU 使用率。仅考虑以 PID 开头的输出行。

top -b -n 2 -d 1 | awk '/^top/{i++}i==2' | awk '/^\s*2593/ {print $9}'

相关内容