有没有办法使用标准的 Linux/Unix 工具来确定进程在用户模式下花费了多少以及等待内核的时间?
换句话说,正是您在使用 时获得的“用户”和“系统”值time,但在流程运行时?
注意:一种方法是使用 WBEM 并枚举 Linux_UnixProcess,但我需要使用除此之外的其他工具;我的目标是验证 WBEM 提供商告诉我的内容,即我需要使用不同的工具。
Sté*_*las 17
在 Linux 上,该信息在字段 14 到 17 中可用(有关详细信息,/proc/$pid/stat请参阅proc(5)):
字段是:
(给定进程的所有线程在那里具有相同的值)
它们不是由 直接报告的ps。
ps报道14 + 15 ps -o time,并14 + 15 + 16 + 17用ps --cumulative -o bsdtime。
请注意,in 中的第二个字段/proc/$pid/stat可能包含空格或换行符,因此您无法使用 awk 的$1, $2...
你可以使用perl像:
$ perl -MPOSIX -l -0777 -ne '@f = /\(.*\)|\S+/gs;
printf "utime: %.2f\nstime: %.2f\ncutime: %.2f\ncstime: %.2f\n",
map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[13..16]' "/proc/$pid/stat"
utime: 3.79
stime: 2.06
cutime: 56.49
cstime: 34.27
Run Code Online (Sandbox Code Playgroud)
一个进程可以用getrusage(RUSAGE_SELF)和检索它自己的时间getrusage(RUSAGE_CHILDREN)。
还有一个times系统调用可以检索相同的信息。POSIX shell 有一个times内置的。一些 shell 还提供带有time(不带参数)的信息。
$ times
0m3.800s 0m2.060s
0m56.512s 0m34.276s
$ ps -o time -p "$$"
TIME
00:00:05
$ ps --cumulative -o bsdtime -p "$$"
TIME
1:36
Run Code Online (Sandbox Code Playgroud)