Java Process(Builder) with Unix: 不能运行 程序
Java Process(Builder) with Unix: cant run program
我想通过 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.IOException: Cannot run program "start_date="2021-06-10" (shorted ...)": error=2, No such file or directory
(我也试过不用变量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();
我想通过 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.IOException: Cannot run program "start_date="2021-06-10" (shorted ...)": error=2, No such file or directory
(我也试过不用变量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();