使用java中的process builder在linux上执行customs命令

时间:2014-07-07 17:21:26

标签: java linux shell

我现在一直在努力解决这个问题,我似乎无法修复它。我已经尝试ProcessBuilder在linux终端上执行自定义命令,但它无法正常工作

实际上我有两个.sh文件setProto.sh and setTls.sh文件,用于设置环境。为了执行命令,我需要先为linux终端的每个实例运行这两个文件。只有这样我们才能够在.sh文件应该运行的linux终端的同一个实例上运行自定义命令anloss。出于某种原因,我无法使其工作,我的代码中的错误是什么?这是代码。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.ProcessBuilder.Redirect;

public class EngineTest {

    public static void main(String[] args) {
        try {
            ProcessBuilder builder = new ProcessBuilder(
                    "/. setProto.sh",
                    "/. setTls.sh",
                    "/anloss -i ${TOOL_INPUT}/census_10000_col5.csv  -d ${TOOL_DEF}/attr_all_def.txt -q k=14,dage=2 -g ${TOOL_RES}/census_100_col8_gen.csv");
            builder.directory(new File(System.getenv("HOME") + "/PVproto/Base"));
            File log = new File("log");
            builder.redirectErrorStream(true);
            builder.redirectOutput(Redirect.appendTo(log));
            Process process = builder.start();

            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            String line = "";
            String output = "";
            while ((line = bufferedReader.readLine()) != null) {
                output += line + "\n";
            }
            System.out.println(output);
            int exitValue = process.waitFor();
            System.out.println("\n\nExit Value is " + exitValue);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

默认情况下,进程不会在shell的上下文中执行;因此,您的shell脚本无法以您尝试的方式执行。

ProcessBuilder pb =
    new ProcessBuilder( "/bin/bash",
                        "-c", 
                        ". setProto.sh && . setTls.sh && /anloss -i ${TOOL_INPUT}/census_10000_col5.csv  -d ${TOOL_DEF}/attr_all_def.txt -q k=14,dage=2 -g ${TOOL_RES}/census_100_col8_gen.csv" );

我不确定/anloss - 命令在root的主页/中是不常见的。 (另外,你在shell脚本前面有/. - 他们应该实现什么?)

<强>后来

确保将/anloss替换为绝对路径名相对于$HOME/PVproto/Base的相对路径名,例如,如果位于此目录中,使用./anloss,如果它在$HOME/PVproto/Base/SomeSub中,请使用SomeSub/anloss等。

另外,如果是setProto.sh和。 setTls.sh不在$HOME/PVproto/Base中,使用适当的绝对路径名或相对路径名。如果是,请使用./setProto.sh./setTls.sh以避免依赖于环境变量PATH的设置。

答案 1 :(得分:0)

我认为你需要使用Runtime.exec()来执行linux上的命令。我想你正在linux机器上执行你的java代码,需要运行linux脚本。

以下代码段将帮助您解决问题。

Process process = Runtime.getRuntime().exec(scriptWithInputParameters);
int exitCode = process.waitFor();
if (exitCode == 0) {
    System.out.println("Executed successfully");
}
else {
  System.out.println("Failed ...");
}


请注意,您需要在不同的线程中处理错误和输出流,以避免缓冲区溢出。

如果上述内容适用于您,则this article将为您提供进一步的帮助