我到处搜索,却一无所获。我试图创建一个小型仪表,显示 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
虽然这个问题已经得到回答并被接受,但我认为它并不完整。接受的答案中缺少了几点。
如果您将 top 作为子进程运行并希望获取任何有意义的输出,则需要使用 -b 以批处理模式运行 top。否则,由于以交互模式运行,top 会包含混合的控制字符。
使用 -n 指定所需的迭代次数,否则将导致无限迭代,子进程将永远无法完成。您需要至少进行两次迭代,以便 top 有一个参考点来收集差异,即实际的 CPU 使用率。
使用 -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}'