【问题标题】:Running a shell script from java code [duplicate]从java代码运行shell脚本[重复]
【发布时间】:2015-06-03 13:52:38
【问题描述】:

试图解决这个问题我差点死了。有人可以帮忙吗...拜托?

下面是代码:

import java.io.*;
import java.lang.Runtime;
import java.util.*;

public class WORKBRO {  

    public static void main(String args[])
    {
        try
        {    
            String target = new String("/home/dhirendra.panwar/Desktop/test.sh");
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec(target);

        } catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}

【问题讨论】:

  • 你得到什么异常?结果是什么?你期望得到什么?
  • 必须运行shell脚本test.sh...但它不起作用...
  • test.sh 包含... #!/bin/bash echo "hola">>dashboard.log
  • 所以应该触发 test.sh 并且应该创建日志文件dashboard.log... :(
  • 什么都试过了,还是不行。 .我也试过那个线程..

标签: java exec


【解决方案1】:

您的代码是正确的,我相信您没有遇到异常,如果您使用proc.getErrorStream() 阅读,您将一无所获。
命令 100% 以这种方式执行,现在的事情是您正在回显某些内容,您需要使用 BufferedReader 将其读回。

检查下面的示例,它将成功创建一个名为“stackOverflow”的目录并打印您正在回显的内容。对于将其放入日志文件,恐怕您可以使用“>”来完成,您可能必须使用一些编辑器命令或使用 Java 创建文件。

底线:Runtime.getRuntime().exec("command") 是从 Java 执行 Unix 命令或脚本的正确且已定义的方式,并且它可以工作。

test.sh

#!/bin/bash
echo "hola"
mkdir stackOverflow

Test.java

import java.io.*;
public class Test {

        public static void main(String[] args) throws Exception {
                try {
                        String target = new String("/home/hagrawal/test.sh");
// String target = new String("mkdir stackOver");
                        Runtime rt = Runtime.getRuntime();
                        Process proc = rt.exec(target);
                        proc.waitFor();
                        StringBuffer output = new StringBuffer();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                        String line = "";                       
                        while ((line = reader.readLine())!= null) {
                                output.append(line + "\n");
                        }
                        System.out.println("### " + output);
                } catch (Throwable t) {
                        t.printStackTrace();
                }
        }
}

【讨论】:

  • 嘿,感谢您确认这确实有效...我尝试了您的代码.. hola 正在控制台上打印,这很好...这意味着脚本正在执行.. 但是目录“ stackOverflow" 没有被创建……太疯狂了……如果脚本正在运行,那么该目录也应该被创建……它会是什么……?
  • 在 test.sh 文件中必须给出创建该文件夹的绝对路径... #!/bin/bash echo "hola" mkdir /tmp/stackOverflow
  • 从 JAVA 调用脚本是个好习惯吗?有性能问题吗?
  • @kautuksahni 我认为这不是实践的“问题”,而是“用例”的问题,如果您正在处理 Java 程序并且需要在内核上调用脚本或执行命令那么你必须这样做,这真的取决于你是否可以反过来实现它,并且从Java代码调用脚本并不少见。我确定您在这种情况下所说的性能问题是什么意思。
  • @hagrawal 感谢您的及时回复,这当然是有益的。当我说性能问题时,它与 JAVA-3rd 方 REST 调用 VS java-Python(脚本调用)有关。我见过很多人从 JAVA 调用 python 脚本,而不是使用 3rd 方语言 (Python) 创建基于 REST 的可扩展架构。我对 JAVA 世界很陌生,所以请原谅我缺乏这方面的知识。但是我想了解 JAVE-Script Call 的调用栈(如果你能提供给我的话)。
猜你喜欢
  • 2018-09-08
  • 2010-10-06
  • 2011-07-12
  • 2014-11-20
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
相关资源
最近更新 更多