2010-02-02 43 views
1

我不是腳本專家,我想知道什麼是最多x毫秒運行腳本的可接受方式(並且如果腳本在超時之前完成,則在x毫秒之前完成)。Un * x shell腳本:最多x毫秒運行腳本的正確方法是什麼?

我使用Bash解決了這個問題,我認爲這很不方便,我想知道是否有更好的方法來做到這一點。

基本上我有一個shell腳本稱爲sleep_kill.sh接受一個PID作爲第一個參數和超時作爲其第二個參數,並且這樣處理:

sleep $2 
kill -9 $1 2> /dev/null 1> /dev/null 

因此,如果PID對應於一個腳本在超時之前完成,沒有任何事情會被殺死(我認爲操作系統沒有時間重複使用這個PID作爲另一個[無關的]進程,看到它在所有進程ID中「循環」,然後開始重用它們)。

無論如何,後來我打電話給我的劇本,可能「掛起」或超時:

command_that_may_hang.sh 
PID=$! 
sleep_kill.sh $PID .3 
wait $PID > /dev/null 2>&1 

我會等待最多300毫秒command_that_may_hang.sh。然而,如果command_that_may_hang.sh只需要10毫秒執行,我將不會在300毫秒內「卡住」。

如果一些shell專家可以解釋這種方法的缺點以及應該做些什麼,那將會很棒。

+2

請參閱http://stackoverflow.com/questions/526782/how-do-i-limit-the-running-time-of-a-bash-script – kennytm 2010-02-02 04:32:55

+0

如果您真的決定使用小於1秒鐘,你會想考慮使用一個特殊的驅動程序的應用程序。即使你有一個sleepMilli,在shell的級別上進行調度也可能會導致300 ms的延遲。 – gary 2010-02-02 05:28:52

回答

2

看一看這個腳本:http://www.pixelbeat.org/scripts/timeout 注意小於一秒的超時值上,由於調度延遲等等。注意大部分系統非常荒謬的也是新的coreutils包括了timeout命令,它具有1的分辨率第二。

+0

+1,非常感謝您的腳本,但是...您能澄清爲什麼超過一秒(!?)的超時是無意義的嗎?我一直使用「sleep.1」,並且在接近1/10秒的時候確實回答:我已經完成了以毫微秒爲單位的打印日期的測試(無論如何,我清楚地看到了「睡眠1 「和」睡眠1「)。如果調度沒有比1秒更好的粒度,那麼視頻播放/聲音播放器如何在Linux上工作?這聽起來很奇怪,在今天這個高精度的計時器和時代! (我很困惑) – SyntaxT3rr0r 2010-02-02 16:54:38

+1

通常它很好,但有時候會有延遲,你會錯誤地超時。從編寫在各種高功率但繁忙系統上運行的coreutils測試的經驗來看,3秒的超時是發現不觸發錯誤超時的最小時間。 – pixelbeat 2010-02-02 23:54:31

相關問題