2011-02-10 4 views
0

まず、この興味深い課題への背景。継続的な統合構築では、デッドロックやループなどの開発やテスト中にテストに失敗することがあります。したがって、ビルドが失敗したことを通知するためのすべてのメカニズムは役に立たなくなります。LinuxのコマンドのI/Oでの単純なタイムアウト

ビルドログファイルへの出力が5分以上続く場合、ビルドスクリプトのタイムアウトが発生するのは、ビルドが進行するにつれてユニットテストの名前を日常的に書き出すからです。だからそれが「凍っている」ことを確認する最善の方法です。

大丈夫です。

ビルドサーバーはHudsonを使用して、NantとMSBuild(Windows上のすべて)に基づいてより複雑なビルドスクリプトを呼び出す単純なbashスクリプトを実行します。

これまでのところ、ネット上のすべてのソリューションには、コマンドの実行時間の合計にタイムアウトが含まれていました。しかし、最初の5分間でテストがハングアップまたはフリーズする可能性があるため、このソリューションは失敗します。我々はこれまで考えられてきたもの

まず、ここではハイレベルのbashコマンドは、ハドソンの完全なテストスイートを実行します。

build.sh clean free test 

このコマンドは、すべてのNantおよびMSBuildビルドログをstdoutに送信するだけです。

それは我々がファイルにその出力をティーする必要があることは明らかです:

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

続いて並列にコマンドが5分以上はメインプロセスを殺す場合は、寝るファイルの修正時刻を確認し、必要があります。その時点ではkill -9は問題ありません。

これはあなたが手助けできる部分です。

実際、私は15年以上前にデータ電話回線を使って日本に接続していたが、何もしなかったことを覚えていない。

敬具

、 ウェイン

答えて

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

を殺す -

はまた、全体のプログラムグループを殺すために方法を考え出すことは、単に いくつかの研究でしたが、簡単であることが判明します*、出力に関係なく5分の壁時計時間後ではありません。 (そうでなければ、質問はhttps://stackoverflow.com/questions/5161193/how-to-kill-a-child-process-after-a-given-timeout-in-bashの複製となります) –

0

あなたがtimeoutを使用することができる場合があります

timeout 300 command 
+0

質問は尋ねます5分後のタイムアウト**には内容が書き込まれていない**、出力に関係なく5分の壁時計時間後ではない。 (そうでなければ、この質問はhttps://stackoverflow.com/questions/5161193/how-to-kill-a-child-process-after-a-given-timeout-in-bashの複製となります) –

0

はbashスクリプトを書くことで自分自身を解決しました。

これは、iotimeoutと呼ばれ、1つのパラメータは秒数です。

あなたはこのようにそれを使用します。

build.shクリーンdevのテスト| iotimeout 120

iotimeoutには2つのループがあります。

1つは、エコーラインをエコーする読み取りラインループですが、 も、touchコマンドを使用して、行を書き込むたびに tmpファイルの変更時刻を更新します。残念ながら、Windozeは ファイルを閉じるまでファイルを修正しないため、build.outファイルを監視することはできませんでした。 しかたがない。

もう1つのループがバックグラウンドで実行されます。これは永久ループ です。このループは10秒間スリープして、修正された時刻 の一時ファイルをチェックします。 120秒を超えると、ループするとプロセスグループ全体が強制的に終了する 。

オリジナルの プログラムの終了コードを返すだけの厄介なものがありました。 Bashはそれを解決するPIPESTATUS配列を提供します。 * OPが書かれていないコンテンツと5分後にタイムアウト**を求めている0