从Spring WebApp运行shell命令

时间:2013-01-09 00:32:48

标签: mysql tomcat web-applications process mysqldump

我想从基于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值。

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路径。但是我如何使这项工作?

1 个答案:

答案 0 :(得分:0)

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

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

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