0

TestNG と Surefire プラグインを有効にした Groovy Maven2 テスト プロジェクトがあります。

最後のテスト メソッドで外部プロセス (いくつかの *.exe ファイルを開始する *.cmd ファイル) を起動し、テストを終了して、テスト後にプロセスを実行したままにします。

私はそれを行うために次のコードを試しました:

1 回試行

def builder = new ProcessBuilder('cmd','/c <name>.cmd')
builder.directory( ( new File( <path_to_working_directory> ) ) )
builder.start()

2 回の試行(start cmd オプションの有無にかかわらず)

Runtime.getRuntime().exec( "cmd /c start <name>.cmd", null , ( new File( <path_to_working_directory> ) ) )

3回の試行

( new AntBuilder() ).exec(
    dir: "<path_to_working_directory>",
    executable: "<name>.cmd"
)     

.cmd は次のとおりです。

set path=<path_to_execFile>;%path%
start <execFileName>.exe

「実行」機能 (Alt+Shift+F10) を介して Intellij IDEA からこれらの各コードを起動すると、コードが正常に実行され、プロセスが開始され、テストが終了した後に実行されます。

Intellij IDEA Maven タスクからこれらの各コードを起動すると、Maven のクリーン インストール (および Jenkins からの Maven タスク) プロセスが正常に開始されましたが、テストは実行されたままです。手動で殺す必要があります。テスト プロセス (Maven プロセス) を手動で強制終了すると、起動した外部プロセスは期待どおりに動作し続けます。

このハングしたテスト プロセスは、今のところ私の頭痛の種です。

多くの資料を調べましたが、この問題の根本原因、修正、回避策さえ見つかりませんでした。私のすべての試行 (おそらく、AntBuilder() を除く) によって、切り離されたプロセスが作成されることがわかります。これはJVMの設定で接続できると思います。しかし、私はどれに見つけることができませんでした。

また、試してみました

"full command to run my cmd".execute()

しかし、それも私を助けませんでした。

問題の解決を手伝っていただけませんか?

前もって感謝します!

4

1 に答える 1

0

したがって、ここで私の問題に対する回答はありません。しかし、いくつかの更新があります。

cmd を直接呼び出す代わりに、PsExec ツールを使用できることがわかりました。

def builder = new ProcessBuilder( 'psexec', 'cmd', '/c', '<name>.cmd' )
builder.directory( ( new File( <path_to_working_directory> ) ) )
builder.start()

そして、このコードは、(Jenkins からではなく) クリーンな Maven からのみ起動すると正常に動作します: プロセスが開始され、Maven タスクが正常に完了し、プロセスが引き続き実行されます。

しかし、Maven2 Jenkins タスクの一部としてこのコードを実行しているときに、再度発行する必要がありました。

この問題を回避するために、最初のマシンの準備中にターゲット マシン上でリッスン モード(およびTCP サーバーの記述) で起動する単純な追加の Groovy サービス スクリプトを手動で作成しました。このスクリプトは常にマシン上で実行されています。

Jenkins から起動したテストから実行するコマンド ファイルの名前をこのリスナーに送信すると、すべての cmd が正常に実行されます。プロセスが開始され、Jenkins タスクが正常に完了し、プロセスが実行され続けます。このリスナー内で processbuilder を使用します。

名前の送信には、単純なソケットを使用します (TCP クライアントの作成)

また、win32 でプロセス ツリーから子を切り離す方法を見つけましたか? . しかし、私のシステムでは、私の方法はよりグルーヴィーに見えると思います。

于 2013-06-19T19:00:22.630 に答える