Процесс Windows, исполняемый с Java, не завершается - PullRequest
9 голосов
/ 26 марта 2009

Я создаю процесс на Windows из 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.

Ответы [ 3 ]

10 голосов
/ 26 марта 2009

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

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 голосов
/ 26 марта 2009

См. ссылку для объяснения.

Вам необходимо прочитать входной поток. Также 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 голосов
/ 26 марта 2009

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

ProcessBuilder pb = new ProcessBuilder(CMD, ARG1, ARG2);  
Process p = pb.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...