0

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

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

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

现在,当我尝试调用基于文本的 Web 浏览器 lynx 时,它不起作用。

如果我在终端中调用它,它工作正常: /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;

    }
4

2 回答 2

1

您需要从Process' 输出流中读取。

既然你不是,底层 lynx 进程可能会在写入输出时阻塞,等待有人清空输出流的缓冲区。 即使您要忽略输出,您也需要阅读它以使进程按预期执行

正如Process 的 javadocs所说,“由于某些原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。 "

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

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

于 2010-05-18T11:33:05.367 回答
0

我解决了它....通过将lynx调用到一个php脚本中,我从Jsp脚本中调用的php脚本...

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

无论如何感谢您的帮助 Andrzej(我猜是捷克语的名字..?^_^),不知何故你让我上路了!

于 2010-05-18T13:17:23.640 回答