Java Runtime Process не будет "Grep" - PullRequest
       5

Java Runtime Process не будет "Grep"

5 голосов
/ 19 октября 2011

Я выполняю некоторые команды из командной строки в моей Java-программе, и кажется, что она не позволяет мне использовать "grep"? Я проверил это, удалив часть "grep", и команда работает отлично!

Мой код, который НЕ РАБОТАЕТ:

String serviceL = "someService";
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("chkconfig --list | grep " + serviceL);

Код, который работает:

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("chkconfig --list");

Почему это? И есть ли какой-то правильный метод или обходной путь? Я знаю, что могу просто проанализировать весь вывод, но мне было бы проще сделать все это из командной строки. Спасибо.

Ответы [ 3 ]

8 голосов
/ 19 октября 2011

Канал (например, перенаправление или >) является функцией оболочки, поэтому выполнение его непосредственно из Java не будет работать.Вам нужно сделать что-то вроде:

/bin/sh -c "your | piped | commands | here"

, который выполняет процесс оболочки в командной строке (включая каналы), указанной после -c (в кавычках).

Итак, вотпример кода, который работает в моей ОС Linux.

public static void main(String[] args) throws IOException {
    Runtime rt = Runtime.getRuntime();
    String[] cmd = { "/bin/sh", "-c", "ps aux | grep skype" };
    Process proc = rt.exec(cmd);
    BufferedReader is = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String line;
    while ((line = is.readLine()) != null) {
        System.out.println(line);
    }
}

Здесь я извлекаю все процессы «Skype» и распечатываю содержимое потока ввода процесса.

6 голосов
/ 19 октября 2011

Вы пытаетесь использовать трубопровод, который является функцией оболочки ... и вы не используете оболочку;вы исполняете процесс chkconfig напрямую.

Простым решением было бы запустить оболочку и заставить ее делать все:

Process proc = rt.exec("/bin/sh -c chkconfig --list | grep " + serviceL);

При этом ... почемуты пишешь в grep?Просто прочитайте вывод chkconfig и выполните сопоставление самостоятельно в Java.

0 голосов
/ 17 августа 2012

String [] commands = {"bash", "-c", "chkconfig --list | grep" + serviceL};Процесс p = Runtime.getRuntime (). Exec (команды);

или, если вы находитесь в среде Linux, просто используйте grep4j

...