繁体   English   中英

定时在shell中并行运行的多个命令并将其保存在文件中

[英]Time multiple commands running in parallel in shell and save it in file

我有一个bash脚本,我想知道该脚本为单个命令运行所花费的时间,并将其保存在日志文件中。 另外,我需要其中一些命令以不同的进程运行。 我面临的问题是我无法分辨哪个输出属于哪个命令,例如我的脚本具有:

echo "output 1:"
(time my_commnad1) 2>> my_log_file.log &

echo "output 2:"
(time my_commnad2) 2>> my_log_file.log &


echo "output 3:"
(time my_commnad3) 2>> my_log_file.log &

echo "output 4:"
(time my_commnad4) 2>> my_log_file.log &
wait

所需的输出(请注意,在这里我可以看到哪个输出属于哪个命令):

output 1:
real    2m39.892s
user    8m37.383s
sys 0m3.338s

output 2:
real    2m39.892s
user    8m37.383s
sys 0m3.338s

output 3:
real    2m39.892s
user    8m37.383s
sys 0m3.338s

output 4:
real    2m39.892s
user    8m37.383s
sys 0m3.338s

但我得到类似的东西:

output1:
output2
output3:
output4:

(不确定它们是否顺序不明是哪一个),在这里我不确定哪个输出属于哪个命令,因为它们独立完成

real    2m39.892s
user    8m37.383s
sys 0m3.338s

real    2m39.892s
user    8m37.383s
sys 0m3.338s

real    2m39.892s
user    8m37.383s
sys 0m3.338s

real    2m39.892s
user    8m37.383s
sys 0m3.338s

我尝试了很多事情,例如先耦合命令,再进行计时,为两个命令创建一个函数,然后对它们进行计时,以及其他许多事情,但是每次发生问题导致问题或没有给我期望的结果时。 我想对于具有bash脚本编写经验的人来说,这应该是一件容易的事。

更新:my_command是这样的:

ffmpeg -i $INPUT_VIDEO_FILE -profile:v baseline -level 4.0 -vf "scale=-2:360,subtitles='dynamic_subtitle.ass':force_style='FontName=Aaargh/Aaargh.ttf,PrimaryColour=&H664c4c4c"  -start_number 0 -hls_time 10 -hls_list_size 0 -f hls s3_temp/$PROJECT_ID/videos/$VIDEO_ID/$VIDEO_ID"_360_.m3u8"

在一些帮助下,我能够找到解决此问题的方法,对我而言有效的是

(time my_commnad1 && echo "output 1" >> my_log_file.log) 2>> my_log_file.log &

(time my_commnad2 && echo "output 2" >> my_log_file.log) 2>> my_log_file.log &

(time my_commnad3 && echo "output 3" >> my_log_file.log) 2>> my_log_file.log &

(time my_commnad4 && echo "output 4" >> my_log_file.log) 2>> my_log_file.log &
wait

我得到的输出是这样的,时间是上面提到的标记之上:

real    2m39.892s
user    8m37.383s
sys 0m3.338s
output 1:


real    2m39.892s
user    8m37.383s
sys 0m3.338s
output 2:


real    2m39.892s
user    8m37.383s
sys 0m3.338s
output 3:


real    2m39.892s
user    8m37.383s
sys 0m3.338s
output 4:

而且我无法正确测试Jacek Zaleski的答案,因为在我尝试这种情况时,它给我带来了语法错误。无论如何,感谢大家的时间和精力。 希望这对某人有帮助。

echo "output 1:" >> my_log_file.log    
time command1... etc etc
echo "------------------------" >> my_log_file.log

这将有所帮助,因为它将允许您写入日志文件并在每个“时间”输出之间添加分隔符

 $(out1="output 1:"; var1=$((time my_command ) 2>&1>/dev/null ); echo -e " $out1 $var1" >>my_log_file.log)  &
 $(out2="output 2:"; var2=$((time my_command ) 2>&1>/dev/null ); echo -e " $out2 $var2" >>my_log_file.log)  &
 $(out3="output 3:"; var3=$((time my_command ) 2>&1>/dev/null ); echo -e " $out3 $var3" >>my_log_file.log)  &

...

Otput
 output 1:
real    0m0.002s
user    0m0.000s
sys     0m0.002s
 output 2:
real    0m0.002s
user    0m0.000s
sys     0m0.002s
....

在带有proces和proces名称的线程变量中使用,接下来我通过回显将stdr流水到文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM