2010-05-18 74 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