我现在一直在努力解决这个问题,我似乎无法修复它。我已经尝试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();
}
}
}
答案 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将为您提供进一步的帮助