2013-06-29 114 views
2

我需要運行一個命令並在運行時間過長時,在bash腳本中將其殺死。我也需要捕獲所有輸出到一個變量。如果命令先完成,我需要釋放/終止看門狗進程(例如睡眠),因爲我可以運行這些命令的列表。高效超時命令並將輸出捕獲到bash腳本中的變量

不幸的是,「超時」命令不能提供給我,othervise我可以做這樣的事情:

output=`timeout -s 9 $TIMEOUT my-command` 

並檢查退出代碼124,看看是否有超時。

因此我選擇的解決方案是by @Dmitry to a similar question

(my_command) & pid=$! 
(sleep $TIMEOUT && kill -HUP $pid) 2>/dev/null & watcher=$! 
wait $pid 2>/dev/null && pkill -HUP -P $watcher 

不幸的是,下列不捕獲任何到$輸出:

(output=`my_command`) & pid=$! 

我可以輸出轉儲到一個文件,然後加載它在像這樣的變量中,但我寧願沒有文件:

(`my_command >$outfile`) & pid=$! 
... 
output=`cat $outfile` 
rm -f $outfile 

我的問題:有更好的方法嗎?理想情況下捕獲stderr以及另一個變量而不使用文件?

回答

1

幸運的是,$()符號允許多個命令,所以你可以這樣做:

output=$(
    (my_command) & pid=$! 
    (sleep $TIMEOUT && kill -HUP $pid) 2>/dev/null & watcher=$! 
    wait $pid 2>/dev/null && pkill -HUP -P $watcher 
) 

您也可以使用普通()到組命令,然後重定向所有的輸出。重定向錯誤輸出到標準輸出可以用2>&1來完成,所以你最終這樣的:

output=$(
    (
     (my_command) & pid=$! 
     (sleep $TIMEOUT && kill -HUP $pid) 2>/dev/null & watcher=$! 
     wait $pid 2>/dev/null && pkill -HUP -P $watcher 
    ) 2>&1 
) 
+0

分組與花括號'{...}',而不是括號完成。 –

+0

@gniourf_gniourf:花括號也可以,但括號確實有效。 –

+1

括號是_subshel​​ls_。請參閱bash參考手冊中的[_Grouping Commands_部分](http://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping) –

相關問題