0

我想从基于 Spring 的 webapp 调用 mysqldump 并将输出写入文件。我希望能够向用户提供在服务器上创建的文件的下载链接。

我尝试运行以下命令:

Runtime.getRuntime().exec("/usr/bin/mysqldump -u <username> -p<password> <db_name> >" + fileName);
Runtime.getRuntime().exec("mysqldump -u <username> -p<password> db_name >" + fileName);

我尝试了以下文件名值。

fileName = "mysql.sql";
fileName = "/tmp/mysql.sql";
fileName = servletContext.getRealPath("") + "/mysql.sql";

但是命令不成功。process.exitValue() 返回错误代码 2 或 6。

  ProcessBuilder pb = new ProcessBuilder("/usr/bin/mysqldump", " -u ", "<username>", " -p<password>", "<db_name>", " > ", fileName);
  pb.redirectErrorStream(true); // equivalent of 2>&1
  Process p = pb.start();
  p.waitFor();

这也无济于事。

有人可以告诉我从 webapp 运行此类命令的最佳方法是什么吗?应该在哪里创建输出文件?上面的命令有什么问题?

我需要能够在不同的系统(Linux、Windows)上运行它。webapp 在任一系统上运行。如果需要,我可以在属性文件中抽象出 mysqldump 路径。但是我该如何做呢?

4

1 回答 1

0

这可能不是一个好主意。servlet 可能需要一个非常宽松的安全环境才能使其正常工作。如果您进行搜索,您会发现很多人对此有疑问。

即使运行时 exec 可能由于某种原因而阻塞并且 servlet 会超时,我也不知道它的后果,但它们对我来说听起来并不好。

我们有一个类似的问题,我在几年前工作并编写了一个简单的多线程服务器,它将请求排队,并在有机会时运行它们并处理诸如挂起、崩溃和重新启动之类的事情。它作为 jsvc 守护进程运行。servlet 通过套接字向它发送一条消息。

于 2013-01-09T01:05:15.017 回答