【问题标题】:Java Process(Builder) with Unix: cant run programUnix的Java进程(Builder):无法运行程序
【发布时间】:2021-09-17 00:59:43
【问题描述】:

我想通过 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 知道这不是文件等吗?

【问题讨论】:

  • ProcessBuilder 没有在 shell 中运行命令。阅读 ProcessBuilder 的 Javadoc。如果您需要更多帮助,请提出另一个问题。

标签: java shell unix processbuilder


【解决方案1】:

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

然后你可以如下执行它

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

【讨论】:

    【解决方案2】:

    允许命令作为单个字符串的唯一 Java 方法是一些 Runtime.exec 方法。正如 sanjeevRm 指出的那样,您需要显式调用 shell 以解释 shell 语法,如 &amp;&amp;&gt;&amp; 以及使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多