在bash中保存每个分叉进程的已用时间

时间:2018-06-08 16:23:46

标签: bash

我正在并行运行六个进程,每个进程需要不同的时间才能完成。我的目标是简单地记录每个过程完成所需的时间。

以下是一个例子:

  1 #!/bin/bash
  2 
  3  { time sleep 30  > /dev/null 2>&1 ; } 2>> testing_time &
  4  PID1=$!
  5 { time sleep 100  > /dev/null 2>&1 ; } 2>> testing_time &
  6  PID2=$!
  7 
  8  wait $PID2
  9  echo "PID2 end" >> testing_time
 10 
 11  wait $PID1
 12  echo "PID1 end" >> testing_time

我得到的输出是:

real    0m30.032s
user    0m0.001s
sys     0m0.003s

real    1m40.025s
user    0m0.001s
sys     0m0.003s
PID2 end
PID1 end

问题是,当我有很多流程时,我真的不知道哪个时间对应哪个流程。我希望得到一些输出,显示过程的经过时间(只有实时也很好),一些注释表明时间对应的过程。

预期产出:

PID1 starts
real    0m30.032s
user    0m0.001s
sys     0m0.003s
PID1 end

PID2 starts
real    1m40.025s
user    0m0.001s
sys     0m0.003s
PID2 end
PID1 end

1 个答案:

答案 0 :(得分:4)

一种合理的方法是设置TIMEFORMAT变量以包含您的命令。

time_silent_cmd() {
  local TIMEFORMAT cmd

  printf -v cmd '%q ' "$@"
  TIMEFORMAT="%R used for ${cmd//%/%%}"
  time { "$@" >/dev/null 2>&1 ; }
}

{
  time_silent_cmd sleep 0.5 &
  time_silent_cmd sleep 0.3 &
  time_silent_cmd printf '%s\n' "Sample with a % sign"
} 2>testing_time
wait

保留包含以下内容的testing_time文件:

0.000 used for printf %s\\n Sample\ with\ a\ %\ sign
0.305 used for sleep 0.3
0.504 used for sleep 0.5

...在哪一点上 - 如果您将printf命令复制并粘贴到提示符,则%q生成的引用将使其评估为其文字内容。