【问题标题】:Calling bash script with redirection from Java从 Java 重定向调用 bash 脚本
【发布时间】:2011-05-19 15:12:16
【问题描述】:

我有一个 bash shell 脚本,它执行一堆命令并使用 > 将命令输出重定向到日志文件。如果我使用Runtime.getRuntime().exec("sh shellscript.sh"); 从Java 调用shell 脚本,shell 脚本会被执行,但不会写入日志文件!为什么?我该如何让它发挥作用?

编辑: 好的,所以我想做的有点不同。您的代码工作正常。但是现在 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);
    }
}

【问题讨论】:

    标签: java bash shell logging redirect


    【解决方案1】:

    检查您是否也对要附加日志的路径具有写入权限。如果您在容器中运行此应用程序,它很可能会使用该用户的 ID。尝试将文件写入/tmp/,看看它是否出现在那里。

    【讨论】:

      【解决方案2】:

      您正在写入的重定向 - 它们是写入绝对文件路径还是相对文件路径?

      如果它是相对的,那么它们将(可能)是相对于工作目录的——所以检查一下。

      我进行的一个示例测试表明绝对路径可以正常工作

      $ 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
      $ 
      

      【讨论】:

      • 它们是相对的。我们只需写类似cat file.txt >> log.txt 的东西。我们已经检查过了!
      • 如果它们是相对的,那么它们将被写入相对于您运行的 java 进程的工作目录的位置。因此,您应该检查与 java 进程的工作目录相关的日志文件。不过,我不建议这样做 - 日志文件应写入绝对位置,该位置必须是可配置的。
      • 好吧,用绝对路径重写它们。没有帮助!
      • 这很奇怪,你能用你的日志重定向代码的 sn-p 更新问题吗?
      • 另外,我希望您确定脚本“实际上”正在运行。我的意思不是说运行时进程只是抛出异常或返回错误?
      【解决方案3】:

      我的 Java 知识很少,但我的理解是你必须写:

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

      【讨论】:

        猜你喜欢
        • 2017-10-21
        • 2019-10-31
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 2014-06-05
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多