2014-01-23 42 views
1

我嘗試從java運行wavemon命令並讀取輸出。 但我無法使Runtime.exec方法工作。ubuntu上的Runtime exec

註釋中的echo命令可用於打印「hello」,但wavemon命令只返回「」。 Wavemon已安裝,我甚至用它的完整路徑(/ usr/bin/wavemon)作爲參數進行了嘗試。 沒有用。

// call wavemon 
Runtime rt = Runtime.getRuntime(); 
String[] cmd = { "sh", "-c", "wavemon", "-i wlan1", "-d" }; 
//String[] cmd = { "sh", "-c","echo hello" }; 
Process proc = rt.exec(cmd); 
proc.waitFor(); 

// read wavemon output into string 
Scanner is = new Scanner(new InputStreamReader(proc.getInputStream())); 

StringBuffer buffer = new StringBuffer(); 
while (is.hasNext()) { 
    buffer.append(is.nextLine()); 

} 

proc.destroy(); 
System.out.println(buffer.toString()); 

wavemon命令的輸出以空行開始,但由於我使用掃描儀,這應該不重要嗎?

$ wavemon -i wlan1 -d 

Configured device: wlan1 (IEEE 802.11abgn) 
Security: WPA, WPA2, TKIP, CCMP 
... 

有一點細節,這段代碼用在Spring框架(spring-boot,tomcat容器)中。

回答

0

你不應該需要「sh -c」。嘗試僅僅只是用:

String[] cmd = { "wavemon", "-i","wlan1", "-d" }; 

此外,你應該把waitFor()讀取來自掃描儀行之後,因爲這樣持有線程,直到過程完成。但是,只有在讀取輸出結果之後,該過程才能完成。你甚至可以看到更多的獨立線程中的所有流。

這篇文章有它的所有細節http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html

+0

我試了一下,我已經讀過這篇文章,但我還是不明白我在做什麼錯:■ – Quentin

+0

可能的輸出被寫入到stderror你需要閱讀那個流? –

+0

也嘗試沒有「sh -c」部分。我從來沒有需要過,即使我在ubuntu上執行這樣的程序。如果您使用「sh -c」,請嘗試如下所示:{「sh」,「-c」,「wavemon -i wlan1 -d」}。根據手冊頁「sh -c」從以下字符串中讀取。所以我假設它期望它是一個整體。 –