2009-04-29 25 views
9

ProcessBuilderを使用してオペレーティングシステムコマンドを準備するJavaアプリケーションがあり、Processオブジェクトがあります。 (実際のosコマンドは、cygwinを使ってsshを使ったrsyncです)。Java ProcessBuilder process.destroy()はwinXPで子プロセスを強制終了しません

これは私が手動でWindowsのタスクマネージャを使用してそれらを殺さなければならない .....私はprocess.destroy()を使用してプロセスを停止する場合しかし、それは子sshとrsyncのプロセスを強制終了しませんが、Windowsでうまく機能します。..

destroy();を呼び出す前に、プロセスのOutputStreamを取得してctrl-cを送信することはできますか?

誰かが回避策についてアイディアを持っていれば、それは素晴らしいことでしょう。 ありがとう、 D

+1

Ctrl-Cは、プロセスIDにシグナル(SIGTERM?)を送信する端末機能です。したがって、プロセスIDが必要であり、シグナルを送信できるようにするためには、 –

答えて

5

また、sshを完全に削除するためにCtrl-Cをエミュレートすることには問題があるとも思います。

私がやることは、以下のアプローチの1つです。あなたのsshの息子を見つけるためにwindowsコマンドを使うか(ちょっとした問題です。あなた自身の子プロセスを受け取るためにあなたの現在のPIDを知る必要があるからです)。 sysinternalsのpstoolsは、孤立したプロセスを追跡できるようにするための優れたコマンドラインツールだと私は信じています。 taskList.exe(CSV形式の出力を与えることができるBTW)または特殊なVBScriptを実行することによって、Windowsプロセスを制御する場合はthis exampleを参照してください。

2番目の方法は、winpなどのJavaライブラリを使用して、sshプロセスを実行および制御します。私は、正しいメッセージを送るだけでは不十分であれば、すべての子供を列挙して強制的に殺すことができると信じています。これが私の好ましいアプローチです。 killRecursivelyメソッドは、まさにあなたが望むものです。

これらのアプローチでは、アプリケーションウィンドウのみをレンダリングしてはならないことに注意してください。 WindowsおよびLinuxマシン上で異なる動作をするクラスにそれらをカプセル化することができます。

Windowsプロセスできめ細かな制御を得ようとはしませんでしたので、私が見つけた解決策がどれほど成熟しているかわかりません。

+0

winpは人気が高まっているようで、Hudsonの一部です(実際には、そのために書かれました)。 java.net URLはこれ以上解決されませんが、元の記事はまだhttps://weblogs.java.net/blog/kohsuke/archive/2008/03/introducing_win.htmlにあります(その情報の一部は32ビットのみのようなものです)。 winpの新しいURL(mvnとgithubへのリンクあり):http://winp.kohsuke.org/ – toddkaufmann

+0

@toddkaufmannありがとう、URLを更新しました。 –

0

Process.destroy()がカバーの下で何をしているのかよく分かりません(シグナルなどを送信しますか?)。

シェルスクリプト内でssh/rsyncを起動し、stdoutにプロセスIDを返してからプロセスを強制終了するときは、そのプロセスIDで/bin/killを実行してください。やや厄介ですが、おそらくより信頼できます。

特に頑固な場合は、/bin/killとSIGTERM、SIGKILLを使用できます。

+2

Process.destroy()はWindows関数TerminateProcess(http://msdn.microsoft.com/en-us/library/ms686714(VS)を呼び出します。 .85).aspx)。 –

関連する問題