获取正在运行的进程的用户和内核时间?

Alo*_*dal 10 process time

有没有办法使用标准的 Linux/Unix 工具来确定进程在用户模式下花费了多少以及等待内核的时间?

换句话说,正是您在使用 时获得的“用户”和“系统”值time,但流程运行时?

注意:一种方法是使用 WBEM 并枚举 Linux_UnixProcess,但我需要使用除此之外的其他工具;我的目标是验证 WBEM 提供商告诉我的内容,即我需要使用不同的工具。

Sté*_*las 17

在 Linux 上,该信息在字段 14 到 17 中可用有关详细信息,/proc/$pid/stat请参阅proc(5)):

字段是:

  • 14:用户时间(时钟滴答数)
  • 15:系统时间
  • 16:用户等待孩子的时间
  • 17:系统等待孩子的时间

(给定进程的所有线程在那里具有相同的值)

它们不是由 直接报告的ps

ps报道14 + 15 ps -o time,并14 + 15 + 16 + 17ps --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)