2017-02-25 109 views
0

我有一個基本的script.sh,它在裏面運行一些命令。劇本是這樣的:設置命令執行的超時時間並將結果輸出到文件

#Go to this directory,pass all folders to compile&execute the program.c file 
[email protected]~$ for D in /Users/czar/Desktop/1/*; do sh script.sh $D; done 

編輯:

(script.sh) 

...... 
`gcc -o program program.c` 
if [ $? -eq 0 ]; then 
    echo "Compiled successfully....\n" >> out.txt 

#set a timeout for ./program execution and append results to file 
(gtimeout 10s ./program) 2> out.txt # <-- NOT WORKING 

...... 

我通過像終端運行此腳本的輸出我得到的終端,不是那麼重要,但:

# program.c from 1st folder inside the above path 
Cycle l=1: 46 46 
Cycle l=1: 48 48 
Cycle l=2: 250 274 250 
Cycle l=1: 896 896 
......... 
# program.c from 2nd folder inside the above path 
Cycle l=1: 46 46 
Cycle l=1: 48 48 
Cycle l=2: 250 274 250 
Cycle l=1: 896 896 
......... 

目標是讓那些進入out.txt

我得到的輸出是差不多我想要什麼:它會在那10秒內執行任何可能的操作,但不會將結果重定向到out.txt,它只會打印到終端。 我嘗試了每個建議here但沒有運氣。

任何其他想法讚賞。

編輯2:在評論中給出的解決方案。

+0

當你嘗試'gtimeout 10s ./program> out.txt'時出現了什麼問題? – rici

+2

你是'gcc -o program program.c'裏面的反引號嗎? – Fred

+0

謝謝你們花時間回答,@rici當我做'gtimeout 10s ./program> out.txt'時,我得到空out.txt,這很奇怪。 @Fred其實沒有理由,反引號被用來執行一個命令,對我來說它更清楚。 – L1lda

回答

0

基本方法比您從答案複製到完全不同的問題的命令簡單得多。你需要做的僅僅是標準輸出重定向到文件內容:

# Use gtimeout on systems which rename standard Gnu utilities 
timeout 10s ./program >> out.txt 

但是,如果該程序是由gtimeout殺死,將可能不會產生所有由程序生成的輸出,因爲輸出仍然坐在在標準庫內的緩衝區中。 (這個緩衝沒有什麼特別的地方,它只是在數據第一次寫入流時由庫函數malloc控制的一塊內存)。當程序終止時,它的內存返回到操作系統;甚至沒有人會嘗試確保將標準庫緩衝區刷新到各自的流中。

有三種緩衝模式:

  • 塊緩衝:無法產生輸出,直到該流的緩衝區已滿。 (通常,流的緩衝區大小約爲8kb,但系統之間會有所不同。)

  • 緩衝行:將換行符發送到流時生成輸出。如果緩衝區填滿,也會產生這種情況,但單線足夠長以填充緩衝區很少見。

  • 無緩衝:完全不執行緩衝。每個字符都會立即發送到輸出。

通常情況下,標準輸出是塊緩衝,除非它指向一個終端,在這種情況下,它將被行緩衝。 (這是不能保證的;各種標準允許有相當多的緯度。)線路緩衝可能是你想要的,除非你習慣寫編寫部分線路的程序。 (在每條輸出行的開始部分放置換行符而不是在最後的奇怪常見成語是一個非常糟糕的主意,正是因爲它打敗了行緩衝。)無緩衝輸出是另一種可能性,但如果程序非常慢產生大量的產出。

通過調用setvbuf寫入任何數據流之前可以更改緩衝模式:(更多選擇見man setvbuf

/* Line buffer stdout */  
setvbuf(stdout, NULL, _IOLBF, 0); 

你也可以告訴庫立即發送任何緩衝的數據通過調用fflush

fflush(stdout); 

,如果你不希望這是一種有效的技術(輕微)的線路緩衝開銷,但是你知道什麼時候發送數據很重要(通常是因爲程序要做很長時間的計算,或者等待一些外部事件)。

如果無法修改源代碼,可以在啓動程序之前使用Gnu實用程序stdbuf更改緩衝模式。 stdbuf不適用於所有程序 - 例如,如果程序確實調用setvbuf,它將不起作用 - 但它通常是有效的。例如,行緩衝標準輸出,你可以這樣做:

timeout 10s stdbuf -oL ./program >> out.txt 
# Or: gtimeout 10s gstdbuf -oL ./program >> out.txt 

更多信息請參見man stdbuf

相關問題