2009-03-26 16 views
9

Ich erstelle einen Prozess unter Windows von Java. Mein Problem ist, dass dieser Prozess nicht beendet wird. Hier ist ein Beispielprogramm:Windows-Prozess ausgeführt von Java nicht beendet

import java.io.IOException; 

public class Test { 

/** 
* @param args 
* @throws IOException 
* @throws InterruptedException 
*/ 
public static void main(String[] args) throws IOException, 
     InterruptedException { 
    Process process = Runtime.getRuntime().exec("cmd /c dir"); 
    process.waitFor(); 
    } 
} 

Aus Gründen, die mein Verständnis übersteigt, wird dieses Programm nie abgeschlossen. Dies ist der Fall, wenn "cmd/c dir" durch ipconfig und andere Dinge ersetzt wird.

Ich kann mit ProcessExplorer sehen, dass Java den CMD-Prozess erstellt. Diese Probe ist offensichtlich eine Vereinfachung; In meinem ursprünglichen Programm habe ich festgestellt, dass der Befehl erfolgreich ausgeführt wird, wenn ich nach einer Weile process.destroy() aufruft und die Ausgabe des CMD-Prozesses überprüfe.

Ich habe dies mit verschiedenen Versionen von Java 1.5 und 1.6 versucht. Mein Betriebssystem ist Windows XP Pro, SP 2.

Antwort

9

Wahrscheinlich müssen Sie nur die stdout und stderr des Prozesses lesen, oder es wird hängen, da der Ausgabepuffer voll ist. Dies ist am einfachsten, wenn Sie stderr nach stdout umleiten, nur um sicher zu sein:

public static void main(String[] args) throws IOException, 
       InterruptedException { 
     String[] cmd = new String[] { "cmd.exe", "/C", "dir", "2>&1" }; 
     Process process = Runtime.getRuntime().exec(cmd); 
     InputStream stdout = process.getInputStream(); 
     while(stdout.read() >= 0) { ; } 
     process.waitFor(); 
    } 
} 
9

diesen link Siehe für eine Erklärung.

Sie müssen den Eingabestrom lesen. Auch der Java-Prozess funktioniert nicht wie eine DOS-Shell. Sie müssen die Argumente selbst weitergeben müssen:

String[] cmd = new String[3]; 
cmd[0] = "cmd.exe" ; 
cmd[1] = "/C" ; 
cmd[2] = "dir"; 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(cmd); 
+0

+1 für das Abfangen des Problems der Argumentübergabe. –

+1

Sie sind nicht ganz richtig. Die API-Dokumentation für exec (String) gibt an, dass das Argument "ein Systembefehl" ist, ohne eine nähere Definition von "Systembefehl". Es ist nicht unwahrscheinlich, dass die JVM die Zeichenfolge einfach an cmd.exe übergibt. – JesperE

+0

Danke für die Antwort und den Link! Ich sollte die Gelegenheit haben, es am Sonntag auf der problematischen Maschine zu überprüfen. Tatsächlich werden die Argumente korrekt übergeben; Ich kann sie im Prozess-Explorer sehen. –

0

Sie sollten versuchen, unten ein ProcessBuilder wie dargestellt verwendet wird. Nicht sicher, was anders ist, aber das hat eine Menge Probleme für uns gelöst.

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