2013-06-03 161 views
4

我在Linux Mint中運行一個shell腳本,它調用一些進程花費幾分鐘的時間。 對於每一個過程中,我想回應類似這樣的消息:顯示運行bash腳本的每秒運行時間

echo "Cleaning temporary files... X seconds." 
myprocess 

,其中X是當前經過的時間,我想它改變每一秒,但不能打印新的生產線。

有沒有很好的方法來做到這一點?我只找到了打印總時間的方法,但不是運行流程的時間。

+0

時間很重要,還是僅僅是某種進步? – mouviciel

+0

@mouviciel它會幫助我控制每個進程運行多少時間。 – rafa

+0

看看這個答案:[如何創建一個秒錶Bash腳本來不斷顯示已用時間?](http://stackoverflow.com/a/10244193/98117)。 – hammar

回答

8

使用此在腳本的開始,這造成其在後臺運行,並不斷更新狀態的子進程。

file=$(mktemp) 
progress() { 
    pc=0; 
    while [ -e $file ] 
    do 
     echo -ne "$pc sec\033[0K\r" 
     sleep 1 
     ((pc++)) 
    done 
} 
progress & 
#Do all the necessary staff 

#now when everything is done 
rm -f $file 
+0

很好的解決方案把輸出發生器放到後臺,並繼續在前臺工作! – ypnos

+1

但是如果腳本的其餘部分輸出顯示在屏幕上,所有東西都會被搞亂:)在我看來,這需要一個全面的'基於對話框的腳本來處理所有場景。但似乎有點工作 – abasu

+0

也許如果我有其他輸出它可能會很棘手的處理兩個,但幸運的是,這不是我的情況,這工作得很好,謝謝你abasu :) – rafa

1

你可以用時間運行命令:

time <command> 

,然後用sed/awk來exctract經過的時間。

1

您必須在後臺運行進程&,否則腳本的其餘部分將一直等到完成。使用backspaces覆蓋您的當前行,所以請確保您不使用換行符。

所以,做你想做的:

myproc & 
myPid=$! # save process id 
tmp="" 
while true; do 
    if kill -0 "$myPid"; then # if the process accepts a signal, keep waiting 
     for i in {0..${#tmp}..1}; do 
      printf "%b" "\b" # print backspaces until we have cleared the previous line 
     done 
     tmp=$(printf "Cleaning temp files... %t seconds.") 
     printf "%s" "$tmp" 
    else 
     break # drop out of the while loop 
    fi 
    sleep 1 
done 
+0

這已經很不錯了。爲什麼不使用回車,\ r呢?爲了說明不同的文本長度,你可以打印一些額外的空格。它更乾淨。你也忘了睡在你的循環中。 – ypnos

+0

@ypnos我保持我的字符串,所以我可以得到所有的長度和退格,不需要額外的空格。我相信'\ r'與'\ n'有相同的問題,但是如果他感興趣,他可以測試它。感謝您注意失蹤的睡眠。 –

0

這裏是一個辦法,讓awk打印STDERR每秒。 你應該只需要添加:

  • 時myprocess結束,創建文件/ tmp/SOMETHING
  • 已經在awk包括一個測試:退出時的/ tmp/SOMETHING出現

環部分(不終止測試......如此「無限循環」,直到CTRL-C)是:

ping 127.0.0.1 | awk ' 
    BEGIN{cmd="date +%s"; cmd|getline startup ; close (cmd) } 
    /bytes from/ { cmd | getline D ; close (cmd) ; 
        print D-startup | "cat >&2" }' 

現在你只需要使用的「printf」和ANSI轉義序列,不換行打印,H AVE的ANSI-逃生回去,直到號碼的開頭,並刷新通過調​​用系統輸出(所有描述符):

ping 127.0.0.1 | awk -v getback4char="$(printf '\033[4D')" ' 
BEGIN{cmd="date +%s"; cmd|getline startup ; close (cmd) ; printf "Elapsed time: ";} 
/bytes from/ { cmd | getline D ; close (cmd) ; 
       printf "%4d%s" ,(D-startup) , getback4char | "cat >&2" 
       system("") }' 

注:這是所有版本的awk,我知道的,甚至是古老兼容(也就是說,不是gawk/nawk,而是古老的awk。)

+0

對於printf上的錯字感到抱歉,現在它再次運行(並顯示「已用時間」) –