проблема при запуске сценария оболочки с использованием Java - PullRequest
2 голосов
/ 04 марта 2009

У меня есть сценарий оболочки с именем test.sh в папке /tmp/padm. В этом сценарии оболочки у меня есть одно утверждение

echo "good"

Я пытаюсь запустить скрипт оболочки, используя код Java.

String cmd=("/tmp/padm/.test.sh");            
Runtime rt = Runtime.getRuntime();
Process pr=rt.exec(cmd);

Но моя проблема в том, что я не могу увидеть "хороший" результат работы сценария оболочки.

Как мне запустить скрипт?

Ответы [ 6 ]

4 голосов
/ 04 марта 2009

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

Process process = Runtime.getRuntime().exec(cmd);
String s = "";
BufferedReader br = new BufferedReader(new InputStreamReader(process
            .getInputStream()));
while ((s = br.readLine()) != null)
{
   s += s + "\n";
}    
System.out.println(s);

BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while (br2.ready() && (s = br2.readLine()) != null)
{
  errOutput += s;
}
System.out.println(errOutput);
1 голос
/ 08 февраля 2013

Попробуйте, это точно будет работать.

Shell Script test.sh code

   #!/bin/sh
   echo "good"

Java-код для выполнения сценария оболочки test.sh

          try {
                Runtime rt = Runtime.getRuntime();
                Process pr = rt.exec(new String[]{"/bin/sh", "/tmp/padm/.test.sh"});

                BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                String line = "";
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                System.out.println(e.toString());
                e.printStackTrace();
            }
1 голос
/ 04 марта 2009
process.getErrorStream();
process.getOutputStream();

- правильный подход, на который указывают oxbow_lakes .

Дополнительно убедитесь, что вы выполняете /bin/sh с указанием расположения сценария оболочки в качестве аргумента.

1 голос
/ 04 марта 2009

Когда вы говорите «на терминале», что вы имеете в виду? Если вы хотите увидеть вывод / ошибку процесса, вам нужно использовать:

process.getErrorStream();
process.getOutputStream();

Кроме этого, нет никаких проблем с использованием Runtime.exec для вызова сценария оболочки

1 голос
/ 04 марта 2009

Это не сработает. Вы должны добавить либо «хэш-удар» в первую строку скрипта, чтобы сообщить Linux, что для интерпретации скрипта он должен использовать подходящий интерпретатор (например, bash), либо явно запустить его через bash из Java.

0 голосов
/ 04 марта 2009

Это дубликат Требуется пример кода Java для запуска сценария .

Пример программы в моем ответе выводит стандартную ошибку и стандартный вывод (пример программы добавляется чуть позже).

Обратите внимание, что streamGobblers работают в отдельных потоках, чтобы предотвратить проблемы с выполнением из-за полных буферов ввода / вывода.

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

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