簡體   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