这个功能是之前的一个同事开发的,最近项目要上线发现功能不能用了,而且没有任何的提示.
看了下具体的代码,他是调用cmd命令来实现的数据库备份,第一反应是:
(1)如果他是使用cmd中mysql的命令来备份那就需要服务器端能执行mysql命令,要想在随意位置都可以,还需要把具体命令的路径加到环境变量里面
然后我在我自己电脑上装了mysql测试,配置好环境变量,发现还是不对,但是手动执行程序中调用的命令却能备份成功,
(2)猜想是CMD执行命令写的有问题,看了他写的代码,确实跟我之前写的不太一样,就改成了我之前写的cmdUtil
更换执行cmd命令的代码后程序就可以正确执行了.
下面是执行命令的代码,跟之前的代码相比较:
(1)指定了命令的执行目录(这里起初我也以为配置了环境变量就可以不用指定,但是不指定一直报错,只能把目录写上,在项目中就在的application.properties文件中添加了这个命令的目录的配置项)
(2)原来的代码中,在执行完之后,new了两个的线程去处理返回的流信息,我这里改成了简单的拼接到字符串,可以在前台提示,或者更新到数据库的备注信息中.
package com.googosoft.utils; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; /** * @version: V1.0 * @author: songyan * @className: CMDUtil * @packageName: com.googosoft.utils * @description: cmd命令执行工具 * @date: 2020/10/24 10:19 */ public class CMDUtil { /** * @author: songyan * @methodsName: runCommand * @param command * @param dir * @description: 在指定目录执行指定命令 * @return: java.util.Map<java.lang.String,java.lang.Object> */ public static Map<String, Object> runCommand(String command, String dir) { Map<String, Object> result = new HashMap<String, Object>(); boolean flag = true; StringBuilder msg = new StringBuilder(); BufferedReader bufferedReader = null; Process proc = null; ProcessBuilder pb = new ProcessBuilder("cmd ", "/c", command); pb.directory(new File(dir)); try { proc = pb.start(); bufferedReader = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "gbk")); String line; while ((line = bufferedReader.readLine()) != null) { msg.append(line); } proc.waitFor(); } catch (Exception ex) { ex.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (Exception ex) { } } if(proc!=null){ proc.destroy(); } } result.put("flag", flag); result.put("msg", msg); return result; } }
执行的命令:cmd /c mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=utf8 wyglxt_w > D:dataBaseFiledataBaseFile20201026133816.sql