2013-10-05 106 views
0

我想從java運行時調用perl腳本。它好工作對我的Windows7的筆記本電腦用下面的代碼,Runtime.getRuntime()。exec奇怪的行爲

try { 
    String cmdString= "c:\\perl64\\bin\\perl.exe c:\\perl64\\eg\\userinput.pl \""+arg1+"\" \""+arg2+"\""; 
    Process p = Runtime.getRuntime().exec(cmdString); 
} catch(IOException e) { 
    System.out.println(e); 
} 

perl腳本運行和生產什麼我希望(更新數據庫)。

當我將整個事情轉移到遠程CentOS服務器時,它不再工作。該腳本是相同的,並且Java代碼,

try { 
    String cmdString= "/opt/lampp/bin/perl /home/support/scripts/userinput.pl \""+arg1+"\" \""+arg2+"\" > /tmp/userinput.log"; 
    log(cmdString); 
    Process p = Runtime.getRuntime().exec(cmdString); 
} catch(IOException e) { 
    System.out.println(e); 
} 

我加了重定向/tmp/userinput.log後,我看到劇本是行不通的。但是根本沒有創建日誌文件。我還添加了日誌以確保java代碼的這部分確實得到執行,而且確實如此。我也嘗試在comString前添加「/ bin/bash」,並沒有什麼區別。但是,當我從命令行直接在遠程服務器上運行cmdString時,它可以正常工作。

現在,當我將cmdString更改爲「touch /tmp/userinput.log」時,它確實會創建空白日誌文件。

所以我知道運行了Runtime.getRuntime().exec(cmdString)命令,並且cmdString在命令行輸入時工作,並且一個簡單的「touch」命令可以用於此設置。但是我完全失去了爲什麼調用perl腳本的實際cmdString不起作用,並且沒有任何信息告訴我什麼是錯誤的。

有人可以幫忙嗎?

回答

1

首先,分隔命令的每個參數,並使用需要String[]的exec版本(您不必擔心引用問題)。另外,由於java沒有執行shell,因此shell重定向不起作用。

+0

shell重定向不起作用使我偏離課程。實際上perl腳本被調用了。它不會因爲參數的雙引號而運行。它的行爲與在Windows上不同。你的建議是對的錢。謝謝。 – user1277061