2009-03-26 5 views
9

Je crée un processus sous Windows à partir de Java. Mon problème est que ce processus ne se termine pas. Voici un exemple de programme:Le processus Windows exécuté à partir de Java ne se termine pas

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

Pour des raisons indépendantes de notre compréhension, ce programme ne se termine jamais. Cela est vrai si "cmd/c dir" est remplacé par ipconfig ainsi que d'autres choses.

Je peux voir en utilisant ProcessExplorer que java crée le processus cmd. Cet échantillon est évidemment une simplification; Dans mon programme d'origine, j'ai trouvé que si j'appelle process.destroy() après un certain temps et que je vérifie la sortie du processus cmd, la commande est exécutée avec succès. J'ai essayé cela avec différentes versions de Java 1.5 et 1.6. Mon système d'exploitation est Windows XP Pro, SP 2.

Répondre

9

Probablement que vous avez juste besoin de lire le stdout et le stderr du processus, ou il va se bloquer car son tampon de sortie est plein. Ceci est plus facile si vous redirigez stderr à stdout, juste pour être sûr:

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

Voir cette link une explication.

Vous devez lire le flux d'entrée. De plus, le processus Java ne fonctionne pas comme un shell DOS. Vous devez passer les arguments vous:

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 pour intercepter le problème de passage d'argument. –

+1

Vous n'êtes pas entièrement correct. Les docs d'API pour exec (String) indiquent que l'argument est "une commande système", sans aucune définition plus proche de "commande système". Il n'est pas improbable que la JVM transmette simplement la chaîne à cmd.exe. – JesperE

+0

Merci pour la réponse et le lien! Je devrais avoir la chance de le vérifier sur la machine problématique le dimanche. En fait, les arguments sont passés correctement; Je peux les voir dans Process Explorer. –

0

Vous devriez essayer d'utiliser un ProcessBuilder comme indiqué ci-dessous. Je ne sais pas ce qui est différent mais cela a résolu beaucoup de problèmes pour nous.

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