我想从基于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路径。但是我如何使这项工作?
答案 0 :(得分:0)
这可能不是一个好主意。 servlet可能需要一个非常宽松的安全环境才能工作。如果你进行搜索,你会发现很多人都有这个问题。
即使它工作,运行时exec可能由于某种原因而阻塞,并且servlet会超时,我不知道它的后果,但它们对我来说听起来不太好。
我有一个类似的问题,我在几年前工作过并编写了一个简单的多线程服务器,它会排队请求,并在有机会运行它们并处理挂起,崩溃和重启等事情。它作为jsvc守护进程运行。 servlet通过套接字向它发送了一条消息。