tomcat - 从 Spring WebApp 运行 shell 命令

标签 tomcat web-applications process mysql

我想从基于 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)上运行它。 Web 应用程序在任一系统上运行。如果需要,我可以在属性文件中抽象出 mysqldump 路径。但是,我该如何进行这项工作呢?

最佳答案

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

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

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

关于tomcat - 从 Spring WebApp 运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226498/

相关文章:

java.lang.OutOfMemoryError : Java heap space with NetBeans 错误

php - 在 Apache-Solr 中搜索部分单词

visual-studio - 如何从Visual Studio Web项目中删除重复的条目?

java - 如何从 Java 运行 bash 脚本

java - 未在请求的 DispatcherServlet 中找到任何 WebApplicationContext,并且未注册 ContextLoaderListener

java - 当我运行 java servlet 查看 JSON 结果时——它弹出文件下载而不是 http ://localhost:8080/

asp.net - 自动化功能性 Web GUI 测试框架 (asp.net)

javascript - 在浏览器中存储私钥的最佳方式?

c++ - Windows 信号量

c++ - 将数据写入管道 C++