2010-05-18 38 views
0

我在运行时类中调用exec方法的jsp脚本中有一个execute(String cmd)。从jsp脚本调用lynx

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

所以我想我的执行命令没问题,因为它正在处理这个问题。

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

如果我把它在一个终端,它工作正常: 在/ usr/bin中/猞猁突降-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脚本调用...

这是一个低劣的解决方案,但至少它的作品......我还有事真的不明白为什么Java的exec命令会这样工作...

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

1

你需要从Process“输出流中读取。

既然你不是,底层的lynx进程可能会在写输出时被阻塞,等待某人清空输出流的缓冲区。 即使您将忽略输出,您仍然需要阅读它才能执行过程,正如您期望的那样执行

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

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

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

+0

嗯好吧,你认为它会工作,如果我只是删除缓冲区读取,只是调用exec方法?因为我实际上不需要看到结果... 我会看看你发布的链接,谢谢你的帮助! – Piero 2010-05-18 11:48:11

+0

我认为缓冲可能会导致两端阻塞,这取决于任何一方的内部实现。这可能是Javadocs“及时”阅读的意思。我肯定会尝试摆脱缓冲,甚至可能用'(while in.read()!= -1){}'替换整个事物? – 2010-05-18 11:53:22

+0

它仍然无法正常工作... -/ 我只想调用以下命令:/ usr/bin/lynx -dump -accept_all_cookies'http://www.someurl.net/?arg1=1&arg2=2' 从一个jsp脚本... 为什么Java/Jsp总是如此挑剔愚蠢的东西....我永远不会喜欢它! php规则! :-p – Piero 2010-05-18 12:50:28