您的位置:首页 > 运维架构 > Shell

java中执行多条shell命令,除了第一条其他都未执行

2017-01-12 15:30 711 查看
最近项目中需要在在java中执行shell命令,用了最常见方式,代码如下:

public class ShellUtil {
public static String runShell(String shStr) throws Exception {

Process process;
process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr});
process.waitFor();
BufferedReader read = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
String result = "";
while ((line = read.readLine())!=null){
result+=line;
}
return result;
}
}


在调用时如下调用:

public class ExecuteShell {
public static void main (String[] args){
String command = "some command";
String message = ShellUtil.runShell(command);
System.out.println(message);
}
}


如果你要同时执行两个命令或者多个命令的情况下,那么调用就会如下所示:

public class ExecuteShell {
public static void main (String[] args){
String command1 = "some command";
String command2 = "some command";
String message1 = ShellUtil.runShell(command1);
String message2 = ShellUtil.runShell(command2);
System.out.println(message1);
System.out.println(message2);
}
}


当时为了节约性能,改为如下形式:

public class ExecuteShell {
public static void main (String[] args){
String command1 = "some command";
String command2 = "some command";
String command = command1 + " && " + command2;
String message = ShellUtil.runShell(command);
System.out.println(message);
}
}


本以为会取巧一下,但是实际结果为,都不会执行了,即整个返回为空,第一条和第二条都没有执行。

解决方案

google了一下:http://stackoverflow.com/questions/21908645/command-in-runtime-getruntime-exec-not-working

按照上述的方案将代码改为

public class ShellUtil {

private static Logger logger = LoggerFactory.getLogger(ShellUtil.class);
public static String runShell(String shStr) throws Exception {

Process process;
process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr});
process.waitFor();
BufferedReader read = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
String result = "";
while ((line = read.readLine())!=null){
result+=line;
}
return result;
}
}


即将
Runtime.getRuntime().exec("command");
改为
Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","command"});


注意:如果是windows操作系统要改为
Runtime.getRuntime().exec(new String[]{"**cmd** exe","-c","command"});


至此,问题解决。

原理解析:(待补充- -)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java shell