从jsp脚本调用lynx

时间:2010-05-18 11:12:16

标签: java jsp exec lynx

我在jsp脚本中有一个execute(String cmd),它从Runtime类调用exec方法。

当我调用本地命令时,它会起作用,就像存储在服务器上的php脚本一样。例如:/ usr / bin / php / path / to / php / script arg1 arg2

所以我猜我的执行命令没问题,因为它正在使用它。

现在,当我尝试调用lynx(基于文本的Web浏览器)时,它无效。

如果我在终端中呼叫它,它可以正常工作: / usr / bin / lynx -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;

    }

2 个答案:

答案 0 :(得分:1)

您需要阅读Process'输出流。

由于你不是这样,潜在的lynx进程可能在写输出时阻塞,等待有人清空输出流的缓冲区。 即使你要忽略输出,你仍然需要阅读它,以便按照你期望的那样执行

正如javadocs of Process所说,“因为某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。“

有关如何处理此问题的一些示例,请参阅http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

编辑:如果您想知道,当您调用PHP脚本时,它可能不会产生大量输出,因此能够在填充输出缓冲区和阻塞之前终止。 lynx命令可能会产生更多输出,从而解决了这个问题。

答案 1 :(得分:0)

我解决了....通过将lynx调用为PHP脚本,我从Jsp脚本调用的php脚本......

这是一个糟糕的解决方案,但至少它有效...我仍然不明白为什么Java的exec命令以这种方式工作......

谢谢你的帮助,无论如何Andrzej(捷克我想从名字......?^ _ ^),不知怎的,你让我在路上!