9


3

私はWindows上でJavaからプロセスを作成しています。 私の問題は、このプロセスが終了しないことです。 これがサンプルプログラムです。

import java.io.IOException;

パブリッククラスTest {

/ **
 *  @param args
 *  IOException  - 例外
 *  @throws InterruptedException * / public static void main(String [] args)IOException、InterruptedExceptionがスローされます。{Process process = Runtime.getRuntime()。exec( "cmd / c dir"); process.waitFor(); }}

私の理解を超えた理由で、このプログラムは決して完成しません。 これは、 "cmd / c dir"がipconfigや他のものに置き換えられた場合に当てはまります。

ProcessExplorerを使用して、javaがcmdプロセスを作成しているのがわかります。 このサンプルは明らかに単純化されています。私のオリジナルのプログラムでは、しばらくしてprocess.destroy()を呼び出してcmdプロセスの出力をチェックすれば、コマンドは正常に実行されることがわかりました。

私はこれをJava 1.5と1.6のさまざまなリリースで試しました。 私のOSはWindows XP Pro SP 2です。

3 Answer


10


おそらく、プロセスの標準出力と標準エラー出力を読むだけでいいですし、そうでなければ出力バッファがいっぱいになるのでハングするでしょう。 安全を期すために、stderrをstdoutにリダイレクトするのが最も簡単です。

public static void main(String [] args)IOException、InterruptedExceptionが発生します。{String [] cmd = new String [] {"cmd.exe"、 "/ C"、 "dir"、 "2>


9


説明については、 linkを参照してください。

入力ストリームを読む必要があります。 また、JavaプロセスはDOSシェルのようには機能しません。 引数を自分で渡す必要があります。

String [] cmd = new String [3]; cmd [0] = "cmd.exe"; cmd [1] = "/ C"; cmd [2] = "dir";ランタイムrt = Runtime.getRuntime();プロセスproc = rt.exec(cmd);


0


下記のように `ProcessBuilder`を使ってみてください。 何が違うのかわからないが、これで多くの問題が解決した。

ProcessBuilder pb = new ProcessBuilder(CMD, ARG1, ARG2);
Process p = pb.start();