2016-03-11 106 views
0

我有一個bash腳本,我想知道運行單個命令所需的時間並將它們保存在日誌文件中。另外我需要這些命令中的一些作爲不同的進程運行。我現在面臨的問題是我不能告訴哪個輸出屬於哪個命令,例如我的劇本有:在shell中並行運行多個命令並將其保存在文件中

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 scripting.Thanks您的時間了一些經驗

更新: 其中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" 
+0

1)這些'my_command'是否在本腳本中被my_command&'放棄了,還是它們自己產生了分離的進程? 2)我認爲不是,但是:你能修改它們嗎?它們是你的代碼嗎? – zdim

+1

@zdim是的我有一個bash腳本,其中包含所有這些my_command(更新問題中的細節)運行幾次 - (我認爲你在後臺調用它,不知道 - 雖然我猜想多處理),我需要知道他們每個人所花費的時間。 – Aameer

回答

1

一些幫助,我能夠找到解決這個問題有什麼適合我的工作方式是這樣的

(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的答案,因爲當我在我的案例中嘗試時,它給了我一些語法錯誤。感謝大家的時間和精力。希望這可以幫助某人。

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

這將作爲幫助它可以讓你寫你的日誌文件和每個「時間」之間添加分隔符輸出

+0

嘿SSSDDD,請再次通過問題我正在並行運行命令,以便他們可以獨立完成這是我想解決的問題,所以在你的情況下我怎麼會知道輸出是從命令一,而不是第二? 。我在這裏錯過了什麼嗎? – Aameer

0
$(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 
.... 

在線程變量中使用進程名和進程名,接下來我通過echo將文件中的stdr流水線化。

+0

你能否請檢查我的問題的更新,並描述我應該使用的格式。 – Aameer

+0

因爲我不確定它將如何使用這些逗號和雙逗號 – Aameer

+0

使用括號(fmpeg ......)示例 $(out1 =「output 1:」; var1 = $((time(cat/var/log/dmesg | wc> test.txt; echo「test2」>> test.txt))2>&1>/dev/null); echo -e「$ out1 $ var1」>> my_log_file.log) – Dzaczek

相關問題