2009-03-26 15 views
9

Estoy creando un proceso en Windows desde Java. Mi problema es que este proceso no termina. He aquí un ejemplo de programa:Proceso de Windows ejecutado desde Java que no termina

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

Por razones ajenas a mi entender, este programa nunca se completa. Esto es cierto si "cmd/c dir" se reemplaza con ipconfig y otras cosas.

Veo usando ProcessExplorer que java crea el proceso de cmd. Esta muestra es obviamente una simplificación; en mi programa original encontré que si llamo a process.destroy() después de un tiempo y verifico el resultado del proceso cmd, el comando se ejecuta con éxito.

He intentado esto con varias versiones de Java 1.5 y 1.6. Mi sistema operativo es Windows XP Pro, SP 2.

Respuesta

9

Es probable que solo necesite leer stdout y stderr del proceso, o se bloqueará debido a que su buffer de salida está lleno. Esto es más fácil si redirige stderr a stdout, sólo para estar seguro:

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

ver este link una explicación.

Debe leer el flujo de entrada. Además, el proceso de Java no funciona como dos shell. Es necesario para pasar los argumentos a sí mismo:

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 para detectar el problema de pasar el argumento también. –

+1

No es del todo correcto. Los documentos API para exec (String) indican que el argumento es "un comando del sistema", sin una definición más cercana de "comando del sistema". No es improbable que JVM simplemente pase la cadena a cmd.exe. – JesperE

+0

¡Gracias por la respuesta y el enlace! Debería tener la oportunidad de verificarlo en la máquina problemática el domingo. En realidad, los argumentos se pasan correctamente; Puedo verlos en Process Explorer. –

0

debería intentar usar un ProcessBuilder como se muestra a continuación. No estoy seguro de qué es diferente pero esto nos solucionó MUCHOS problemas.

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