定期显示进程的“时间”

定期显示进程的“时间”

一周前,我启动了如下模拟:

make rebuild; time make run

我使用该命令time记录了每种情况下使用的 CPU 时间。

一周后,模拟完成,但令我惊讶的是,时间统计数据没有显示。目标make run基本上只是:

python SCRIPTNAME | tee SCRIPTNAME.log

事实上,我发现与最后 4 或 5 次迭代(10000 次)相对应的输出无处可寻。它既没有显示在屏幕上,也没有附加到日志文件中)

我的问题是:

  1. 怎么可能?

  2. 是否可以time定期显示时间统计信息,以避免在我描述的情况下必须重新运行整个模拟?

答案1

输出time显示在 stderr 上。因此,如果您想在日志文件中捕获其输出,则需要重定向 stderr。

但请注意, in zshlike in ksh,time是一个关键字,

time cmd 2>&1 |  tee log

实际上 cmd 2>&1 | tee log(以及两者cmdtee)。如果您只想计时cmd并将 stdout 和 stderrcmd以及time输出到管道的重定向到tee,您需要:

{ time cmd; } 2>&1 | tee log

至于定期检索,我认为这是不可能的。这是由内核计算的,并在父进程终止后可供父进程使用。等待()ed为其子级(使用getrusage())。

time另请注意,即使在报告使用情况时他们已经死亡,未由父母等待的孙子的使用也不会被计算在内(init实际上将对其进行计算)。

一个进程可以得到它的自己的time使用信息(例如,参见alone in的输出zsh),但对于该children部分,只有当您的直接子级死亡并报告其使用情况时,它才会递增,因此即使您make在后台启动并time定期运行,该children部分也不会获得每个make终止子项都会增加。make(代表 的内核)将计算这些子项的使用情况,并且累积使用情况仅在返回时make可用。zshmake

如果您只对 CPU 时间感兴趣,而不是更改后跟踪getrusage()和报告的其他信息,在 Linux 上,time$TIMEFMT您可以从中获取信息/proc/pid/stat和一些摘要ps,但又是儿童使用对于给定进程,仅包括已终止的直接子进程的累积使用量。

就像是:

time cmd &
perl -MPOSIX -l -0777 -e '
  while (<STDIN>) {
    @f = /\(.*\)|\S+/gs;
    printf "%s %s cutime: %.2f cstime: %.2f\n",
      strftime("%T",localtime), $f[1],
      map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[15,16];
    sleep 1;
    seek STDIN,0,0;
  }' < /proc/$!/stat

仅当执行的进程的每个直接子进程死亡并死亡时,您才会看到cutime(累积用户时间)和(系统)递增cstimecmdcmd等待对于他们来说。

示例输出zsh -c 'repeat 5 {head -c200M /dev/zero | pixz > /dev/null}'cmd:

15:19:32 (zsh) cutime: 0.00 cstime: 0.00
15:19:33 (zsh) cutime: 0.00 cstime: 0.00
15:19:34 (zsh) cutime: 0.05 cstime: 0.25
15:19:35 (zsh) cutime: 0.05 cstime: 0.25
15:19:36 (zsh) cutime: 19.21 cstime: 1.04
15:19:37 (zsh) cutime: 19.21 cstime: 1.04
15:19:38 (zsh) cutime: 19.21 cstime: 1.04
15:19:39 (zsh) cutime: 19.26 cstime: 1.31
15:19:40 (zsh) cutime: 37.94 cstime: 2.05
15:19:41 (zsh) cutime: 37.94 cstime: 2.05
15:19:42 (zsh) cutime: 37.97 cstime: 2.36
15:19:43 (zsh) cutime: 37.97 cstime: 2.36
15:19:44 (zsh) cutime: 57.17 cstime: 3.07
15:19:45 (zsh) cutime: 57.17 cstime: 3.07
15:19:46 (zsh) cutime: 57.22 cstime: 3.36
15:19:47 (zsh) cutime: 76.06 cstime: 4.10
15:19:48 (zsh) cutime: 76.06 cstime: 4.10
15:19:49 (zsh) cutime: 76.06 cstime: 4.10
15:19:50 (zsh) cutime: 76.08 cstime: 4.42

您会看到时间批量增加(当headpigz进程终止时)。

相关内容