2

スレーブを使用せずに、Tomcat を介して Hudson を Windows サービスとして実行しています。ジョブの最後のビルド ステップは、Java コードを呼び出すバッチ ファイルです。このコードは、PostgreSQL のコマンド ライン ツール psql を (Runtime.exec() 経由で) 使用して、ローカル マシン上にデータベースを作成し、最終的にそれに対していくつかのテストを実行します。

ジョブはこの時点まで進行し、データベースの作成を開始せずに無期限にハングします。コマンドラインからバッチファイルを実行すると、完全に機能します。http://hudson.gotdns.com/wiki/display/HUDSON/Spawning+processes+from+buildが適用されるとは思わない私が間違っている場合はお知らせください。

@anjanb を編集: バッチ ファイルの唯一の目的は Java コードを呼び出すことであり、唯一のユーザー入力はコマンド ライン引数として渡されます。ビルドのコンソール出力を介して直接入力されていることがわかります。

Process Explorer は、psql が開始されていることを示していますが、psql が与えられた最初のコマンドは新しいデータベースを作成することであるため、明らかに実行されていませんが、それは起こっていません。

編集 2: Hudson ユーザーのメーリング リストからヒントをいくつか得ました。月曜日にそれらを試して、また報告します。

編集 3: Java コードは既に出力ストリームを消費していました。コードの開発時にその記事を使用しました。何が起こっているのかわからないので、psql と Runtime.exec() に頼るのではなく、JDBC を使用してデータベースを作成するようにコードを再開発しています。

4

2 に答える 2

3

プロセスの出力を読みますか? OSバッファが処理できる以上の出力を生成する場合は、それを読み取る必要があります...

また、一部のプロセスは入力が完了するまで待機します。プロセスの開始後に process.getInputStream().close() を呼び出してみてください。

この記事も面白いかも。「Runtime.exec() が機能しない場合」と呼ばれます: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2

于 2008-09-26T22:04:15.147 に答える
0

プログラムが何らかのユーザー入力を待機している可能性があります。サービスがユーザー入力を受け入れるように構成されていない場合、ハングしているように見えます。

ユーザー入力(GUI)を許可するようにサービスを構成することで試すことができます-それは役立つかもしれません。

また、Sysinternals ProcessExplorer と ProcessMonitor を実行することもできます。これらは、.BAT ジョブが停止した場所を見つけることができます。

于 2008-09-26T06:06:17.317 に答える