java进程(builder)与unix:cant运行程序

ebdffaop  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(384)

我想通过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:无法运行程序“start_date=“2021-06-10”(短路…):错误=2,没有这样的文件或目录
(我还通过直接输入日期,在没有变量start_date的情况下进行了尝试)
为什么不起作用?我是否可以配置java知道这不是一个文件等。?

lawou6xi

lawou6xi1#

您可以在单独的.sh文件中编写脚本,并传递文件路径和脚本执行所需的任何参数(此处可能需要传递startdate)
然后您可以按如下方式执行它

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

fykwrbwg2#

唯一允许命令作为单个字符串的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();

相关问题