2010-12-03 103 views
1

我有一個bash shell腳本,它執行一堆命令並使用>將命令輸出重定向到日誌文件。如果我使用Runtime.getRuntime().exec("sh shellscript.sh");從Java調用shell腳本,shell腳本會被執行,但日誌文件不會被寫入!爲什麼?我如何使它工作?用Java重定向調用bash腳本

編輯: 好吧,所以我想要做的是有點不同。你的代碼工作正常。但是現在在Java程序中重定向不起作用。在下面的示例程序中,日誌文件未寫入!

$ cat script.sh 
#!/bin/sh 

echo "Hello there" 
echo "Hello there 2" 


$ cat RunScript.java 
public class RunScript { 
    public static void main(String[] argv) throws Exception { 
     int i = Runtime.getRuntime().exec("sh /home/gpx/script.sh >> log").waitFor(); 
     System.out.println("Exit code : " + i); 
    } 
} 

回答

2

您正在寫入的重定向 - 他們正在寫入絕對文件路徑還是相對文件pahts?

如果它是相對的,那麼他們(可能)會相對於工作目錄 - 所以檢查一下。

進行了抽樣檢測我的DID顯示絕對路徑,將工作

$ cat script.sh 
#!/bin/sh 

echo "Hello there" 
echo "Hello there 2" >> /Users/madhurt/test/log 

exit 2 

$ cat RunScript.java 
public class RunScript { 
    public static void main(String[] argv) throws Exception { 
     int i = Runtime.getRuntime().exec("sh /Users/madhurt/test/script.sh").waitFor(); 
     System.out.println("Exit code : " + i); 
    } 
} 
$ pwd 
/Users/madhurt/test 
$ ls -lrt 
total 24 
-rwxr-xr-x 1 madhurt staff 87 Dec 6 18:28 script.sh 
-rw-r--r-- 1 madhurt staff 214 Dec 6 18:32 RunScript.java 
-rw-r--r-- 1 madhurt staff 907 Dec 6 18:32 RunScript.class 
$ java RunScript 
Exit code : 2 
$ ls -lrt 
total 32 
-rwxr-xr-x 1 madhurt staff 87 Dec 6 18:28 script.sh 
-rw-r--r-- 1 madhurt staff 214 Dec 6 18:32 RunScript.java 
-rw-r--r-- 1 madhurt staff 907 Dec 6 18:32 RunScript.class 
-rw-r--r-- 1 madhurt staff 14 Dec 6 18:33 log 
$ cat log 
Hello there 2 
$ 
+0

他們是相對的。我們只是寫一些像`cat file.txt >> log.txt`。我們已經檢查過了! – GPX 2010-12-03 08:54:35

+1

好吧,如果它們是相對的,那麼它們將被寫入一個相對於您運行的java進程的工作目錄的位置。所以你應該檢查相對於java進程的工作目錄的日誌文件。我不會建議,儘管 - 日誌文件應寫入絕對位置,必須是可配置的。 – madhurtanwani 2010-12-03 14:18:19

0

我的Java知識是缺乏的,但它是我的理解是,你必須寫:

Runtime.getRuntime().exec("sh shellscript.sh").waitFor(); 
0

檢查,如果你有將權限寫入您正在追加日誌的路徑。如果您在容器中運行此應用程序,它很可能會使用該用戶的ID。嘗試在/tmp/中寫入文件,看看它是否出現在那裏。