http://blog.csdn.net/arkblue/article/details/7897396
一、直接调用版
使用到Process和Runtime两个类,返回值通过Process类的getInputStream()方法获取
package ark;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class ReadCmdLine {
public static void main(String args[]) {
Process process = null;
List processList = new ArrayList();
try {
process = Runtime.getRuntime().exec("ps -aux");
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = input.readLine()) != null) {
processList.add(line);
}
input.close();
} catch (IOException e) {
e.printStackTrace();
}
for (String line : processList) {
System.out.println(line);
}
}
}
调用shell脚本,判断是否正常执行,如果正常结束,Process的waitFor()方法返回0
publicstaticvoidcallShell(String shellString) {
try{
Process process = Runtime.getRuntime().exec(shellString);
intexitValue = process.waitFor();
if(0!= exitValue) {
log.error("call shell failed. error code is :"+ exitValue);
}
} catch(Throwable e) {
log.error("call shell failed. "+ e);
}
} 二、异步版
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;
public class ShellExec {
public static void execShell(String command) {
InputStreamReader stdISR = null;
InputStreamReader errISR = null;
Process process = null;
//String command = "/home/Lance/workspace/someTest/testbash.sh";
long timeout = 10 * 1000;
try {
process = Runtime.getRuntime().exec(command);
//CommandStreamGobbler errorGobbler = new CommandStreamGobbler(
//process.getErrorStream(), command, "ERR");
//CommandStreamGobbler outputGobbler = new CommandStreamGobbler(
//process.getInputStream(), command, "STD");
//errorGobbler.start();
// 必须先等待错误输出ready再建立标准输出
//while (!errorGobbler.isReady()) {
//Thread.sleep(10);
//}
//outputGobbler.start();
//while (!outputGobbler.isReady()) {
//Thread.sleep(10);
//}
CommandWaitForThread commandThread = new CommandWaitForThread(
process);
commandThread.start();
long commandTime = new Date().getTime();
long nowTime = new Date().getTime();
boolean timeoutFlag = false;
while (!commandThread.isFinish()) {
if (nowTime - commandTime > timeout) {
timeoutFlag = true;
break;
} else {
Thread.sleep(1000);
nowTime = new Date().getTime();
}
}
if (timeoutFlag) {
// 命令超时
//errorGobbler.setTimeout(1);
//outputGobbler.setTimeout(1);
System.out.println("正式执行命令:" + command + "超时");
}
//while (true) {
//if (errorGobbler.isReadFinish() && outputGobbler.isReadFinish()) {
//break;
//}
//Thread.sleep(10);
//}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
} finally {
if (process != null) {
process.destroy();
}
}
}
public class CommandWaitForThread extends Thread {
private Process process;
private boolean finish = false;
private int exitValue = -1;
public CommandWaitForThread(Process process) {
this.process = process;
}
public void run() {
try {
this.exitValue = process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
finish = true;
}
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public int getExitValue() {
return exitValue;
}
}