процесс убийства Java после определенного периода времени - PullRequest
1 голос
/ 29 января 2010

мой код выглядит так:

        Runtime rt = Runtime.getRuntime();
        // cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
        Process proc = rt.exec(cmd);

Теперь я хочу убить этот процесс через секунду и получить его вывод и ошибку в строковые переменные

Как это сделать?

В моем случае: У меня есть инфинитивный цикл в скомпилированном классе Sth. Я начинаю это и затем, через одну секунду, я хочу убить это.

// Я тестирую его на Win XP, затем на Debian.

ТНХ Tzim

Ответы [ 4 ]

3 голосов
/ 29 января 2010
Runtime rt = Runtime.getRuntime();
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
Process proc = rt.exec(cmd);

(в вашем cmd есть опечатка, вместо "-Xms2M" вы написали "= Xms2M", то же самое для "-Xmx16M").

Никогда не вызывайте Runtime.exec так: вы должны разбить ваш 'cmd' на массив, иначе вы столкнетесь с множеством проблем. Сделайте это так:

String[] sar = { "cmd.exe", "/C", "java", "-Xms2M", "-Xmx16M", "Sth" };
Runtime.getRuntime().exec( sar );
3 голосов
/ 29 января 2010

Это будет немного сложно, потому что, как только вы завершите процесс, его вывод больше не будет доступен, поэтому вам нужно захватить вывод, прежде чем убить его.

Thread.sleep(1000); 
InputStream in = proc.getInputStream();
byte[] data = new byte[in.available()];
in.read(data);
proc.destroy();

Это предполагает, что процесс тем временем не закрывается. Если это произойдет, InputStream будет недоступен для использования, и вам будет жаль, что вы не читали данные, а вертелись.

Вы определенно захотите сделать это исключение безопасным - поместите вызов на proc.destroy в обработчике finally, чтобы гарантировать, что дочерний процесс завершится.

1 голос
/ 07 ноября 2013

Это может также помочь вам:

private static String runCommand(boolean debug, String... script) throws IOException, InterruptedException {
    Runtime rt = Runtime.getRuntime();
    Process process = rt.exec(script);
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StreamReaderUtil.UTF8));
        Thread.sleep(1000);
        StringBuilder queryExe = new StringBuilder();
        try {
            String str;
            while(reader.ready() && (str = reader.readLine()) != null) {
                queryExe.append(str).append("\n");
            }
        } catch(IllegalThreadStateException e) {
            Thread.sleep(250);
        }
        // FIXME: Replace with a Logger
        if(debug) {
            System.out.println("Executing : " + script);
            System.out.println("Result    : " + queryExe);
        }
        return queryExe.toString();
    } finally {
        if(process != null) {
            process.destroy();
        }
        if(reader != null) {
            reader.close();
        }
    }
}
1 голос
/ 29 января 2010

Вы можете использовать ProcessBuilder , который возвращает Process объект и использовать его метод destroy ().

Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...