我正在并行运行六个进程,每个进程需要不同的时间才能完成。我的目标是简单地记录每个过程完成所需的时间。
以下是一个例子:
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
答案 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
生成的引用将使其评估为其文字内容。