2011-02-10 22 views
0

首先介紹這個有趣的挑戰。在開發和測試死鎖,循環或導致永無止境的測試的其他問題期間,持續集成構建通常會失敗。所以通知構建失敗的所有機制都變得毫無用處。針對Linux命令的I/O上的簡單超時

該解決方案將有構建腳本超時,如果有零點輸出爲超過5分鐘生成日誌文件,因爲構建定期寫出單元測試的名字因爲它的收益。所以這是識別「凍結」的最佳方式。

好的。現在的基本...

構建服務器使用Hudson運行一個簡單的bash腳本,該腳本調用基於Nant和MSBuild(全部在Windows上)的更復雜的構建腳本。

到目前爲止四處撒網的所有解決方案涉及的命令的總運行時間超時。但是這種解決方案在這種情況下失敗了,因爲測試可能會在前5分鐘內掛起或凍結。

我們已經想到至今:

首先,這裏的高層bash命令運行完整測試套件哈德森。

build.sh clean free test 

,簡單地命令將所有的南特和MSBuild的建立記錄到標準輸出。

很明顯,我們需要三通是輸出到文件:

build.sh clean free test 2>&1 | tee build.out 

然後平行命令需要睡覺,檢查修改文件的時間,如果超過5分鐘殺死的主要過程。 A kill -9在這一點上將會很好 - 一旦凍結就沒有優雅的需要。

這是你可以幫助的部分。

其實,我做了這樣一個劇本早在15年前殺人的休止期之後的數據電話線來日本的連接,但不記得我是怎麼做的。

真誠, 韋恩

回答

1
build.sh clean free test 2>&1 | tee build.out & 
sleep 300 
kill -KILL %1 
+0

的OP被要求超時**沒有書面內容五分鐘後* *,而不是五分鐘的掛鐘時間,而不管輸出。 (否則,問題將會是https://stackoverflow.com/questions/5161193/how-to-kill-a-child-process-after-a-given-timeout-in-bash的重複) – 2017-11-02 19:22:51

0

您可以使用timeout

timeout 300 command 
+0

問題要求在五分鐘後超時**而沒有寫入內容**,而不管五分鐘的掛鐘時間,而不管輸出如何。 (如果不是這樣,這個問題將會是https://stackoverflow.com/questions/5161193/how-to-kill-a-child-process-after-a-given-timeout-in-bash的重複) – 2017-11-02 19:23:31

0

通過編寫一個bash腳本解決了這個自己。

這就是所謂的iotimeout與一個參數是多少秒。

您這樣使用:

build.sh clean dev test | iotimeout 120

iotimeout具有2個循環。

一個是簡單的讀線迴路,回聲線回顯但 它也使用觸摸命令來更新每次寫入一行 tmp文件的修改時間。不幸的是,它不是 可能監視build.out文件,因爲Windoze不會 更新文件修改時間,直到您關閉文件。好吧。

另一個循環運行在後臺,這是一個永久循環 睡10秒,然後檢查修改時間 臨時文件。如果該值超過120秒,則循環強制整個進程組退出。

唯一棘手的問題是返回原始 程序的退出代碼。 Bash給你一個PIPESTATUS數組來解決這個問題。

而且,搞清楚如何殺死整個節目組 一些研究,但原來是易剛 - 殺0