вызвать рысь из сценария JSP - PullRequest
0 голосов
/ 18 мая 2010

У меня есть execute (String cmd) в сценарии jsp, который вызывает метод exec из класса Runtime.

Это работает, когда я вызываю локальную команду, как скрипт php, хранящийся на сервере. например: / usr / bin / php / path / to / php / script arg1 arg2

Так что я думаю, что моя команда execute в порядке, так как она работает с этим.

Теперь, когда я пытаюсь вызвать lynx, текстовый веб-браузер, он не работает.

Если я позвоню в терминал, он будет работать нормально: / usr / bin / lynx -dump -accept_all_cookies 'http://www.someurl.net/?arg1=1&arg2=2'

Но когда я вызываю это из моей команды execute, ничего не происходит ...

Есть идеи, почему?

Это мой метод выполнения:

public String execute(String cmd){


        Runtime r = Runtime.getRuntime();
        Process p = null;
        String res = "";

        try {
                    p = r.exec(cmd);
                    InputStreamReader isr = new InputStreamReader(p.getInputStream());
                    BufferedReader br = new BufferedReader(isr);
                    String line = null;
                    //out.println(res);
                    while ((line = br.readLine()) != null) {

                    res += line;

                    }
                    p.waitFor();
                    } catch (Exception e) {
                    res += e;
                    }
                    System.out.println(p.exitValue());

        return res;

    }

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Вам нужно прочитать из Process 'выходного потока.

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

Как javadocs процесса скажем: «Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса и даже к взаимной блокировке».

См. http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html, где приведены некоторые примеры того, как с этим справиться.

Редактировать: если вам интересно, есть вероятность, что когда вы вызываете PHP-скрипт, он не производит многовывода, и поэтому был в состоянии завершить работу перед заполнением буфера вывода и блокировкой.Предполагается, что команда lynx производит больше выходных данных и, следовательно, решает эту проблему.

0 голосов
/ 18 мая 2010

Я решил это ... вызвав lynx в php-скрипт, php-скрипт, который я вызвал из Jsp-скрипта ...

Это дерьмовое решение, но, по крайней мере, оно работает ... Я до сих пор не совсем понимаю, почему команда exec из Java работает таким образом ...

В любом случае, спасибо за вашу помощь, Анджей (чешский, я думаю, по названию ..? ^ _ ^), Как-то вы меня подставили!

...