2009-03-26 4 views
9

Я создаю процесс в Windows с Java. Моя проблема заключается в том, что этот процесс не заканчивается. Вот пример программы:Windows process exec'ed с Java не заканчивается

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

По причинам, отличным от моего понимания, эта программа никогда не завершается. Это верно, если «cmd/c dir» заменен ipconfig, а также другими вещами.

Я могу видеть, используя ProcessExplorer, что java создает процесс cmd. Этот пример, очевидно, является упрощением; в моей первоначальной программе я обнаружил, что если я вызову process.destroy() через некоторое время и проведу вывод процесса cmd, команда будет успешно выполнена.

Я пробовал это с различными версиями Java 1.5 и 1.6. Моя ОС - Windows XP Pro, SP 2.

ответ

9

Вероятно, вам просто нужно прочитать stdout и stderr процесса, или он будет висеть, поскольку его выходной буфер заполнен. Это проще, если вы поменяете STDERR на стандартный вывод, на всякий случай:

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

Смотрите эту link для объяснения.

Вам необходимо прочитать входной поток. Также java-процесс не работает, как оболочка dos. Вы должны передавать аргументы себя:

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 для того, чтобы поймать проблему передачи аргументов. –

+1

Вы не совсем правы. В документах API для exec (String) указано, что аргумент является «системной командой», без какого-либо более подробного определения «системной команды». Не исключено, что JVM просто передает строку в cmd.exe. – JesperE

+0

Спасибо за ответ и ссылку! У меня должен быть шанс проверить это на проблемной машине в воскресенье. На самом деле аргументы передаются правильно; Я вижу их в Process Explorer. –

0

Вы должны попробовать с помощью ProcessBuilder, как показано ниже. Не уверен, что другое, но это позволило решить много проблем для нас.

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