Запись аргументов командной строки в log4j - PullRequest
0 голосов
/ 18 октября 2011

Внутри моего Java-кода я создал сценарии, в которых выполняются определенные команды оболочки, в частности, выполняются команды -scp- и -mv-. Можно ли зарегистрировать результаты выполнения? Например, если копируемый файл не найден или -scp- или -mv- не отображаются должным образом, он записывается в подготовленный мной файл журнала. В настоящее время мой код выполнения команды выглядит следующим образом:

  if ("command") {
                String command = "mv " + source_file_path + "/"
                        + " " + dest_file_path;
                Process child = Runtime.getRuntime().exec(command);
                exitVal = child.waitFor();

                // Get the input stream and read from it
                InputStream in = child.getInputStream();

                BufferedInputStream bis = new BufferedInputStream(in);
                ByteArrayOutputStream buf = new ByteArrayOutputStream();
                int c = bis.read();

                while (c != -1) {
                    byte b = (byte) c;
                    buf.write(b);
                    c = bis.read();
                }
                in.close();
                System.out.println("Input Stream: " + buf.toString());
                buf.close();
                bis.close();
                InputStream ein = child.getErrorStream();
                BufferedInputStream ebis = new BufferedInputStream(ein);
                ByteArrayOutputStream ebuf = new ByteArrayOutputStream();
                int ce = ebis.read();

                while (ce != -1) {
                    // process((char)c);
                    byte be = (byte) ce;
                    ebuf.write(be);
                    ce = ebis.read();
                }
                ein.close();
                System.out.println("Error Stream: " + ebuf.toString());
                ebuf.close();
                ebis.close();   
        }   
        System.exit(0);

Могу ли я добавить на него компонент регистрации? Для входа в систему, когда файл не найден, когда файл не передан должным образом, когда переданный файл имеет проблему .. и т. Д.

1 Ответ

1 голос
/ 18 октября 2011

Для определения результата проанализируйте выходные данные команды, которую вы захватываете в ByteArrayOutputStream с именем buf, и зарегистрируйте ее. Вы также можете получить подсказку из кода выхода процесса , который вы сохранили в exitVal.

Обратите внимание, что вызывая child.waitFor () перед чтением потоков stdout и stderr, вы гарантируете, что это не сработает, если выходные данные процесса станут слишком большими. Согласно документации Process API : «Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных потоков ввода и вывода, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса и даже тупик. "

...