【问题标题】:Fail to execute mysql command to restore dump with Apache Commons Exec无法执行 mysql 命令以使用 Apache Commons Exec 恢复转储
【发布时间】:2021-04-02 13:14:30
【问题描述】:

我的目标是使用 mysql 命令恢复 Mysql 转储。

我在使用 ProcessBuilder 和 Apache Commons Exec (1.3) 的代码之间有明显的行为差异。

这段代码运行良好

List<String> params = new ArrayList<>();
params.add("sh");
params.add("-c");
params.add("mysql -uroot -proot < /tmp/the_dump.sql");

ProcessBuilder pb = new ProcessBuilder(params);
Process p = pb.redirectErrorStream(true).start();
int exitValue = p.waitFor();

但是这个(使用 Apache Commons Exec)

CommandLine cmdLine = new CommandLine("/usr/bin/sh");
cmdLine.addArgument("-c");
cmdLine.addArgument("mysql -uroot -proot -e 'source /tmp/the_dump.sql'");

PumpStreamHandler streamHandler = new PumpStreamHandler(System.out, System.err, System.in);
Executor executor = new DefaultExecutor();
executor.setStreamHandler(streamHandler);
int exitValue = executor.execute(cmdLine);

因以下错误而崩溃:

请注意 Apache Commons Exec 解释的命令末尾缺少的 '。

有没有人知道如何让它与 Apache Commons Exec 一起工作?

非常感谢您的帮助, 西尔文

【问题讨论】:

    标签: java mysql processbuilder apache-commons-exec


    【解决方案1】:

    sh shell 将mysql -uroot -proot -e 'source /tmp/the_dump.sql' 解释为单个文件并试图找到该文件以执行。您需要通过写入其输入流将命令传递给 sh。

    sh shell 通常接受来自标准输入流的命令。如果您在终端窗口中启动 sh,则键盘是标准输入。在这种情况下,您正在启动一个子流程,因此 Java 可以访问该子流程的输入和输出流。在 Java 中,您可以通过执行以下操作将命令写入 sh 的流:

    CommandLine cmdLine = new CommandLine("/usr/bin/sh");
    byte[] buf = "mysql -uroot -proot -e 'source /tmp/the_dump.sql'".getBytes();
    ByteArrayInputStream is = new ByteArrayInputStream(buf);
    PumpStreamHandler streamHandler = new PumpStreamHandler(System.out, System.err, is);
    Executor executor = new DefaultExecutor();
    executor.setStreamHandler(streamHandler);
    int exitValue = executor.execute(cmdLine);
    

    请注意,通过在 PumpStreamHandler 中使用 System.outSystem.err,您将处理 java 进程的输出和错误流,而不是 sh 子进程。

    【讨论】:

    • 感谢您的提示,我会尽快尝试。无论如何,我还必须处理用户输入以提供用户密码,因此很难处理两个输入!因此,我选择了使用接受一些参数的 shell 文件的解决方案。处理起来更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2017-02-05
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多