프로세스의 "시간"을 주기적으로 표시

프로세스의 "시간"을 주기적으로 표시

일주일 전에 저는 다음과 같은 시뮬레이션을 시작했습니다.

make rebuild; time make run

나는 이 명령을 사용하여 time각 경우에 사용된 CPU 시간을 기록했습니다.

일주일 후 시뮬레이션이 완료되었는데, 놀랍게도 시간 통계가 표시되지 않았습니다. 목표는 make run기본적으로 다음과 같습니다.

python SCRIPTNAME | tee SCRIPTNAME.log

실제로 마지막 4~5번의 반복(10000)에 해당하는 출력을 찾을 수 없습니다. 화면에 표시되지도 않고 로그 파일에 추가되지도 않습니다.)

내 질문은 다음과 같습니다

  1. 어떻게 그럴 수 있습니까?

  2. time제가 설명한 상황에서 전체 시뮬레이션을 다시 실행하지 않아도 되도록 주기적으로 시간 통계를 표시 할 수 있습니까 ?

답변1

출력은 timestderr에 표시됩니다. 따라서 출력을 로그 파일에 캡처하려면 stderr을 리디렉션해야 합니다.

zsh하지만 like in ksh에서는 time키워드라는 점에 유의하세요 .

time cmd 2>&1 |  tee log

실제로이류 cmd 2>&1 | tee log(그리고 둘 다 cmd의 합 tee). 타이밍을 맞추고 cmdstdout 및 stderr cmdtime출력을 파이프로 리디렉션하려면 tee다음이 필요합니다.

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

주기적 검색은 불가능하다고 생각합니다. 이는 커널에 의해 계산되며 상위 프로세스가 종료된 후 상위 프로세스에서 사용할 수 있습니다.잠깐()ed해당 하위 항목( 사용 getrusage())

time또한, 부모가 기다리지 않은 손자의 이용은 init신고 시점에 사망한 경우에도 집계되지 않습니다(실제로 집계됩니다).

프로세스는 자신의내 자신의time사용 정보(예: alone in 의 출력 참조 zsh). 그러나 해당 children섹션의 경우 직계 자녀가 사망하고 사용량을 보고할 때만 증가하므로 make백그라운드에서 시작하고 time주기적으로 실행 종료하는 하위 항목이 증가됩니다. (표시된 커널)은 이러한 하위 키의 사용량을 계산하며 누적 사용량은 반환 시에만 사용할 수 있습니다.childrenmakemakemakezshmake

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

시간 배치가 증가하는 것을 볼 수 있습니다( 프로세스가 종료되는 시기 head와 시기).pigz

관련 정보