2009-03-26 11 views
9

Sto creando un processo su Windows da Java. Il mio problema è che questo processo non termina. Ecco un esempio di programma:Processo di Windows eseguito da Java non terminato

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(); 
    } 
} 

Per ragioni al di là della mia comprensione, questo programma non viene mai completato. Questo è vero se "cmd/c dir" viene sostituito con ipconfig e altre cose.

Posso vedere utilizzando ProcessExplorer che java crea il processo di cmd. Questo esempio è ovviamente una semplificazione; nel mio programma originale ho trovato che se chiamo process.destroy() dopo un po 'e controllo l'output del processo cmd, il comando è eseguito con successo.

Ho provato questo con varie versioni di Java 1.5 e 1.6. Il mio sistema operativo è Windows XP Pro, SP 2.

risposta

9

Probabilmente basta leggere lo stdout e lo stderr del processo oppure si bloccherà poiché il buffer di output è pieno. Questo è più facile se si reindirizza stderr su stdout, giusto per essere sicuri:

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

Vai a questa link per una spiegazione.

È necessario leggere il flusso di input. Anche il processo java non funziona come una shell dos. È necessario passare gli argomenti da soli:

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 per catturare anche l'argomento che passa il problema. –

+1

Non sei completamente corretto. L'API doc per exec (String) afferma che l'argomento è "un comando di sistema", senza una definizione più precisa di "comando di sistema". Non è improbabile che la JVM passi semplicemente la stringa a cmd.exe. – JesperE

+0

Grazie per la risposta e il link! Dovrei avere la possibilità di controllarlo sulla macchina problematica di domenica. In realtà, gli argomenti vengono passati correttamente; Posso vederli in Process Explorer. –

0

Si dovrebbe provare a utilizzare un ProcessBuilder come illustrato di seguito. Non so cosa sia diverso, ma questo ha risolto un sacco di problemi per noi.

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