运行该ps
命令时,输出如下:
PID TTY TIME CMD
494 pts/0 00:00:00 ps
29487 pts/0 00:00:00 bash
32617 pts/0 00:00:02 gedit
为什么是TIME
00:00:00
?bash
根据极客对极客,解释如下:
它只是任何进程的总累计 CPU 使用时间,00:00:00 表示内核到目前为止还没有给出 CPU 时间。在上面的例子中,我们发现,对于 bash,没有给出 CPU 时间。
有人有更好的解释吗?
答案1
该ps
命令报告进程的 CPU 使用率秒. 如果你想获得这些信息毫秒,你可以看看这个答案的结尾。
ps
将进程使用的总 CPU 时间截断为最接近的低秒数,因此您可以放心地假设您查找的进程(bash
在您的例子中)已经使用了少于一 CPU 秒迄今为止。
这是正常的,因为bash
不会进行任何数字运算而花费太多的 CPU 周期。bash
只是从输入中读取命令并调用相关的可执行文件来执行命令请求的工作。
bash
本身并不是一个“CPU 密集型”进程。但是,您可以bash
通过运行以下bash
命令、等待几秒钟并使用Ctrl+终止它来利用一些 CPU 时间C:
while [[ true ]] ; do : ; done
此后,您可以再次检查bash
运行所花费的 CPU 时间ps
。
我编写了一个简单的脚本来显示进程使用的总 CPU 时间以毫秒为单位。实际上,在大多数系统中,时钟每秒滴答 100 次,因此输出的准确性是几十毫秒内。您可以通过传递一个指定您感兴趣的进程的进程 ID 的参数来调用此脚本,例如它将494
在您的问题中。
#!/bin/bash
usage="Usage: $(basename $0) pid"
case "$*" in
''|*[!0-9]*)
echo "$usage" 1>&2
exit 1
;;
* )
pid="$1"
;;
esac
read -r -a pinfo <<< $(cat "/proc/$pid/stat" 2>/dev/null)
if (( ${#pinfo[@]} == 0 )) ; then
echo -e "No proccess with PID : $pid" >&2
exit 2
fi
let clk_tck="$(getconf CLK_TCK)"
let utime="${pinfo[13]}"
let stime="${pinfo[14]}"
let cputime=(utime + stime)*1000/clk_tck
echo "PID : ${pinfo[0]}
Cmd : ${pinfo[1]}
CPU : $cputime msec"