Непоследовательное поведение при выполнении командного файла из Java - PullRequest
0 голосов
/ 27 ноября 2018

Наш java-метод выполняет пакетный сценарий, как показано ниже:

String command = batchFilePath + File.separator + filename + " " + path;
logger.info("Command to be executed = " + command);
Process process = Runtime.getRuntime().exec(command);
logger.info("Batchfile execution has started");

Мы столкнулись с ситуацией, когда выполнение пакетного файла не произошло.Однако оба оператора регистратора до и после были правильно зарегистрированы.Также приведенный выше фрагмент находится в блоке try catch, и мы видим, что в журналах не было никаких исключений.Пакетный файл выполняет другой файл .exe, и вывод этого файла записывается в отдельный файл, и этот файл также не был создан.В пакетном файле у нас есть операторы logger, если выполнение .exe является ошибкой, но там также нет ошибок.

Может ли кто-нибудь помочь нам определить, почему выполнение пакетного файла не произошло, поскольку мы не видим никаких ошибок или исключений.

1 Ответ

0 голосов
/ 27 ноября 2018

Попробуйте это.

Это объясняет, как захватить ошибку и вывод для запущенного потока

Вы можете использовать process.getErrorStream(), чтобы получить ответ об ошибке из вашего процесса.

И вы можете создать поток для постоянного чтения из этого потока ошибок, например:

static class StreamGobbler extends Thread {
    InputStream is;
    String type;

    StreamGobbler(InputStream is, String type){
        this.is = is;
        this.type = type;
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ((line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
            } catch (IOException ioe) {
                ioe.printStackTrace();  
            }
    }
}

public static void main(String[] args){

     String command = batchFilePath + File.separator + filename + " " + path;
     logger.info("Command to be executed = " + command);
     Process process = Runtime.getRuntime().exec(command);
     logger.info("Batchfile execution has started");

     StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
     errorGobbler.start();
}
...