我在使用Runtime执行命令时,会用到重定向或管道的符号,例如备份mysql数据库
mysqldump -uuser -p database > /opt/test.sql
用Runtime.exec(String cmd)命令执行,会报错,要不然就是process.waitfor()返回1,不是0,通过查找资料发现使用这个方法时,不能有“<”"">"|"这几个符号,否则会出错,但是我就是要用,怎么办?
方法一:个别符号可以替换
">"符号可以直接替换为"-r"
例如原来的代码是
String cmd="mysqldump -uuser -p database > /opt/test.sql"
//执行不通过
Runtime.getRuntime().exec(cmd);
把">"替换为-r的代码是
String cmd="mysqldump -uuser -p database -r /opt/test.sql"
//执行通过
Runtime.getRuntime().exec(cmd);
其他的暂时我也没有找到什么符号可以替换。
方法二:推荐均适用
使用exec的其他方法
public Process exec(String [] cmdArray)
这里面参数传的是一个数组,数组的前两个值跟系统有关,可以认为是固定的,第3个值就是你要执行的命令,具体为
windows端,用cmd执行
String cmd="mysqldump -uuser -p database > /opt/test.sql"
//执行通过
Runtime.getRuntime().exec(new String[]{"cmd","/c",cmd});
linux端,用/bin/bash执行
String cmd="mysqldump -uuser -p database > /opt/test.sql"
//执行通过
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",cmd});
如果你要在windows和linux端都用到这个方法,那就获取系统名判断一下
String cmd="mysqldump -uuser -p database > /opt/test.sql"
String os=System.getProperty("os.name").toLowerCase();
if(os.contains("windows")
Runtime.getRuntime().exec(new String[]{"cmd","/c",cmd});
else if(os.contains("linux"))
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",cmd});
//含有><|符号均可以执行通过