【问题标题】:call lynx from jsp script从 jsp 脚本调用 lynx
【发布时间】:2010-05-18 11:12:15
【问题描述】:

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

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

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

现在当我尝试调用基于文本的网络浏览器 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;

    }

【问题讨论】:

    标签: java jsp exec lynx


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • hmm 好的,所以你认为如果我只是删除缓冲区读取并调用 exec 方法会起作用吗?因为我其实不需要看结果...反正我会看看你贴的链接,谢谢你的帮助!
    • 我认为缓冲可能会导致两端阻塞,具体取决于两边的内部实现。这可能是 Javadocs 中“迅速”阅读的意思。我当然会尝试摆脱缓冲,甚至用(while in.read() != -1) {} 替换整个东西?
    • 它仍然不起作用... :-/ 我想要的只是调用命令: /usr/bin/lynx -dump -accept_all_cookies 'someurl.net/?arg1=1&arg2=2' 从 jsp 脚本... 为什么Java/Jsp 对愚蠢的东西总是那么挑剔吗……我永远不会喜欢它! php规则! :-p
    • lynx 进程是否会提示您输入某些内容(可能是确认)?如果它希望您输入 y/n,那么它似乎从您的角度来看是挂起的。可能值得在某处记录输入流的内容,这样您就可以看到 Lynx 在做什么,和/或使用strace 之类的东西来查看 Lynx 进程挂起时的状态。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多