2010-12-03 68 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/中写入文件,看看它是否出现在那里。