我到处search,一无所获。 我正在尝试创build一个显示由PID指定的一个进程的CPU使用情况的小规格。
我需要命令来打印一个简单的答案,所以为什么top -p $ pid不好。 该命令由PHP执行,需要立即打印响应。
与我需要的东西密切相关的东西是
sudo ps -p $pid -o %cpu
但经过testing和search一些更多,我发现这打印的过程开始以来的平均使用量。 我需要从命令运行的那一刻起的实时使用,就像上面显示的一样。
这可能吗?
编辑::
$cmd = 'sudo sh -c "top -n1 | awk \'/30100/ {print $9}\'"'; echo exec($cmd);
尝试没有壳
$cmd = "sudo top -n1 | awk '/30100/ {print $9}'"; echo exec($cmd);
仍然没有结果,它不回应任何东西
那么,我将以如此简单的方式开始:
$ 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可以正则expression式为您的PID,然后打印CPU值:
username@usrver / $ top | awk '/2593/ {print $10}' 25 29 30 32
虽然这个问题已经得到答复和接受,但我认为它是不完整的。 接受的答案中有几点缺失。
如果您将其作为subprocess运行,并且希望获取任何有意义的输出,则需要使用-b以批处理模式运行top。 如果没有,则会以交互模式运行,导致混合使用控制字符。
使用-n指定所需的迭代次数,否则将导致无限迭代,subprocess将永远不会结束。 你需要至less有两个迭代,所以顶部将有一个参考点来收集差异,这是实际的CPU使用率。
使用-d指定迭代之间的时间间隔。 在大多数系统上,默认值是3秒。 所以如果你想每秒使用一次,你需要明确地指定它。
现在结合上面的所有要点,你会得到
top -b -n 2 -d 1
由于我们有两个迭代,我们只需要考虑第二个输出。 使用awk获取第二个输出,它以string顶部开始。
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}'