[英]Unix Script not working in Java Process Runtime.exec()
我正在Spring Web MVC中開發應用程序,我需要在其中執行一些linux腳本。
我正在使用tomcat 5.5版在Linux中運行我的項目。
我的代碼看起來像這樣:
Process proc = runtime.exec("sudo cp /var/tmp/mailserverfiles/editinterface.txt /etc/sysconfig/network-scripts/editinterface.txt");
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
System.out.println("\nOUTPUT = " + line);
}
System.out.print("\nbefore execute6");
try {
if (proc.waitFor() != 0) {
System.err.println("\nexit value = " + proc.exitValue());
}
} catch (InterruptedException e) {
System.err.println("\nERROR = " + e);
}
在這里,我想使用linux腳本將特定文件從一個位置cp到另一個位置。
但是當我執行這部分時,我得到了
exit value = 1
作為輸出..我也試圖將此腳本放入.sh文件,並嘗試從Java Code在此處執行該Shell腳本,但是我得到的結果是相同的。
誰能告訴我,這是什么原因?
提前致謝..
我猜想sudo
需要一個交互式終端來要求輸入密碼。 由於沒有交互式終端,它將向stderr打印一條錯誤消息,並以退出代碼1退出。您沒有讀取錯誤流,因此不會看到任何可能打印的消息。
在任何情況下,您都絕對希望讀取錯誤流。 現在這樣做將幫助您診斷此時出了什么問題。
我假設運行Tomcat的用戶可以不受限制地訪問sudo? 而且沒有提示您輸入密碼嗎?
嘗試執行命令時,搜索路徑可能很奇怪,並且找不到“ cp”和“ sudo”。
您可以嘗試以下方法來找出問題所在:
嘗試運行不帶“ sudo”的“ cp”命令。
嘗試提供命令的完整路徑名。 這樣可以避免搜索路徑問題。
默認情況下,“ sudo”使用syslog(3)記錄失敗的命令。 查看是否可以在相應的日志文件中找到跟蹤。
假設您可以從命令行運行命令,以tomcat用戶身份登錄-試試
ProcessBuilder pb = new ProcessBuilder("/usr/bin/sudo", "cp",
"/var/tmp/mailserverfiles/editinterface.txt",
"/etc/sysconfig/network-scripts/editinterface.txt");
pb.redirectErrorStream(true);
Process proc = pb.start();
... rest of code as before
如果仍然失敗,請開始調試。 strace應該會有所幫助。 例如,從Java應用程序運行此Shell腳本,並找出/tmp/trace.txt文件中失敗的地方:
#!/bin/sh
strace -f sudo cp /var/tmp/mailserverfiles/editinterface.txt /etc/sysconfig/network-scripts/editinterface.txt >/tmp/trace.txt 2>&1
盡管不直接回答您的問題,但以下內容將有所幫助。 您需要讀取stdout和stderr(以捕獲所有進程的輸出),並同時進行以防止阻塞生成的進程。 有關更多信息,請參見此答案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.