2010-05-18 3 views
0

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

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

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

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

Если я называю это в терминале, он отлично работает: /USR/бен/рыси -dump -accept_all_cookies «http://www.someurl.net/?arg1=1&arg2=2»

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

Любая идея, почему?

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

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; 

    } 

ответ

0

я ее решил .... по телефону рысь в PHP скрипт, PHP скрипт, который я назвал из сценария Jsp ...

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

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

1

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

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

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

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

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

+0

hmm ok, так вы думаете, что это сработает, если я просто удалю чтение буфера и просто вызову метод exec? Потому что мне действительно не нужно видеть результат ... Я посмотрю на ссылку, которую вы отправили в любом случае, спасибо за вашу помощь! – Piero

+0

Я думаю, что буферизация может заставлять оба конца блокироваться в зависимости от внутренних реализаций с обеих сторон. Вероятно, это означает, что Javadocs означает «быстро» читать. Я бы, конечно, попытался избавиться от буферизации, возможно, даже заменил все на '(while in.read()! = -1) {}'? –

+0

он все еще не работает ...: -/ все, что я хочу, это вызвать команду:/usr/bin/lynx -dump -accept_all_cookies 'http://www.someurl.net/?arg1=1&arg2=2' из сценария jsp ... Почему Java/Jsp всегда так придирчивы к глупым вещам ... Мне никогда не понравится! php правила! :-p – Piero