使用Java连接Linux系统执行命令并且获取返回信息
如果需要连续执行几个linux命令,使用;(分号)隔开
如:
String[] cmd = new String[]{"/bin/sh", "-c",“cd /usr/local;pwd”};
log.info("cmd:"+ArrayUtils.toString(cmd));
Process ps = Runtime.getRuntime().exec(cmd);
相当于在linux执行:
cd /usr/local
pwd
String result = null;
try {
String[] cmd = new String[]{"/bin/sh", "-c",commandStr};
log.info("cmd:"+ArrayUtils.toString(cmd));
Process ps = Runtime.getRuntime().exec(cmd);
printMessage("regular",ps.getInputStream()); //打印标准输入流返回的结果
printMessage("error",ps.getErrorStream()); //打印错误信息
Thread.sleep(100); //休眠100毫秒,等待子线程从缓存获取执行结果
while(StringUtils.isBlank(regularResult) && StringUtils.isBlank(errorResult)) {
//如果没有执行结果
Thread.sleep(500); //当前线程等待500毫秒
if( (System.currentTimeMillis()-starttime) >= 3000 ) {break;} //如果执行时间超过3秒,结束
}
//boolean b = ps.waitFor(10, TimeUnit.SECONDS); //等待命令执行完成
//log.info("v:"+b);
} catch (Exception e) {
e.printStackTrace();
}
private String regularResult = null; //标准输出结果
private String errorResult = null; //错误流结果
//多线程获取标准命令执行后 输入流信息 以及错误流信息
private void printMessage(final String rs,final InputStream input) {
final String as = null;
new Thread(new Runnable() {
@Override
public void run() {
Reader reader = new InputStreamReader(input);
BufferedReader bf = new BufferedReader(reader);
String line = null;
StringBuffer sb = new StringBuffer();
try {
while((line=bf.readLine())!=null) {
sb.append(line).append("
");
}
if("error".equals(rs)) {
//log.info("error:");
//log.info(sb.toString());
errorResult = sb.toString();
}else if("regular".equals(rs)) {
//log.info(sb.toString());
regularResult = sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}