使用Unix的Java Process(Builder):无法运行程序



我想通过Java执行shell命令,并尝试使用ProcessBuilder.class和Process.class:

public Process createProcess() throws IOException 
{       
List<String> cmds = new ArrayList<>();
cmds.add("start_date="2021-07-04" && echo "Starting with startdate=$start_date""); 
return (new ProcessBuilder(cmds)).start();
}

当我在shell上执行完全相同的命令时,它就会工作。当我在Java中这样做时,我得到:

java.io.io异常:无法运行程序"start_ date=";2021-06-10";(短…(":error=2,没有这样的文件或目录

(我也尝试过直接输入日期,不使用变量start_date(

为什么它不起作用?我可以以某种方式配置,让Java知道这不是一个文件等吗。?

您可以在单独的.sh文件中编写脚本,并传递文件的路径和脚本执行所需的任何参数(此处可能需要传递startDate(

然后你可以执行如下

String[] cmd = {"sh","-c",pathOfShellScript+" "+ startDate}; 
ProcessBuilder pb = new ProcessBuilder();
pb.command(cmd);
Process proc = pb.start();

唯一允许将命令作为单个字符串的Java方法是一些Runtime.exec方法。正如sanjeevRm所指出的,为了解释像&&>&这样的shell语法以及shell变量的使用,您需要显式地调用shell。

然而,你不需要这些东西。Java可以做到这一切。

String startDate = "2021-07-04";
File log = new File("/data/DOCKER/test/test.log");
String startMessage = "Starting with startdate=" + startDate;
System.out.println(startMessage);
Files.writeString(log.toPath(), startMessage);
ProcessBuilder builder = new ProcessBuilder(
"docker", "exec", "test", "bash", "-c",
"cd /prior/ && python3 -m test.app"
+ " --config_path=/data/DOCKER/prior/config.json"
+ " --start_date=" + startDate);
builder.redirectErrorStream(true);
builder.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
return builder.start();

最新更新