Unix Script не работает в Java с использованием Process Runtime - PullRequest
0 голосов
/ 12 ноября 2009

Я занимаюсь разработкой приложения, в котором мне нужно было запустить некоторые сценарии Unix из Java Code.

Платформа, которую я использую - Unix, Tomcat 5.5 ..

Для этого мой пример кода выглядит следующим образом:

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("netstat -i|tail -n +3|cut -d ' ' -f1");
System.out.println("exitValue = "+proc.exitValue());

Я дал все права пользователю tomcat.

Теперь мои выходные программы:

Script                         exitValue()
=======                        ============
netstat -i                          0
netstat -i|tail -n +3               4
sudo netstat -i                     1
sudo netstat -i|tail -n +3          1

Над таблицей видно, что только 1-й сценарий выполняется в Unix, все остальные не работают.

Я не уверен, но я просто предполагаю, что мне нужно запустить Tomcat Server от имени пользователя root.

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

Заранее спасибо ...

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

Если я правильно помню, трубы ("|") обрабатываются оболочкой. Java, вероятно, не будет обрабатывать их вообще ...

Есть несколько обходных путей:

  • запустить bash с вашими командами в качестве параметра:

    runtime.exec("bash -c \"netstat -i|tail -n +3|cut -d ' ' -f1\"");

  • написать скрипт bash, который запускает все эти команды и запускает этот скрипт из Java:

    #!/bin/bash
    netstat -i|tail -n +3|cut -d ' ' -f1

  • создать каналы в Java: прочитайте вывод netstat -i и подключите его в Java к tail -n +3 ...

0 голосов
/ 12 ноября 2009

Получил решение вышеуказанной проблемы ..

Я только что создал простой файл сценария оболочки и поместил сценарий в этот файл .sh.

Теперь на стороне Java, я просто вызываю простой файл сценария оболочки.

Process proc = runtime.exec("sh /usr/tmp/try1.sh");

Вот и все !!!

0 голосов
/ 12 ноября 2009

Использование | Цепочка команд в Unix является частью оболочки, и Runtime.exec () запускает команду напрямую, а не через оболочку. Быстрое исправление может быть (не проверено, поскольку у меня нет доступного окна Unix в данный момент), чтобы префикс оболочки как первая команда.

Process proc = runtime.exec("/bin/sh netstat -i|tail -n +3|cut -d ' ' -f1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...