public class ProcessUtil {
private static final Logger logger = LoggerFactory.getLogger(ProcessUtil.class);
private static final Integer WAIT_TIME = 20;
/**
* 执行脚本命令
* @param commands
* @throws
*/
public static Integer exec(List<String> commands, StringBuffer outPutResult) throws Exception{
String[] arrCommands = list2Array(commands);
ProcessBuilder processBuilder = new ProcessBuilder(arrCommands);
processBuilder.redirectErrorStream(true);
Process process = null;
try {
process = processBuilder.start();
final BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));
new Thread(() -> {
try {
String str;
while ((str = br.readLine()) != null) {
if(outPutResult != null){
outPutResult.append(str);
}else{
logger.info(str);
}
}
}catch (Exception e) {
logger.error("获取子进程输出错误:", e);
}
});
process.waitFor(WAIT_TIME, TimeUnit.SECONDS);
return process.exitValue();
} finally {
if(process != null){
process.destroy();
}
}
}
/**
* List转String
* @param commands
* @return
*/
private static String[] list2Array(List<String> commands){
String[] commends = new String[commands.size()];
commands.toArray(commends);
return commends;
}
}
执行多条命令:
* List<String> commend = new ArrayList<>();
* commend.add("/bin/sh");
* commend.add("-c");
* // /bin/bash -c '7zzs x /usr/data/tmp/测试.zip -o/usr/data/tmp/one/ && convmv -f GBK -t utf8 --notest -r /usr/data/tmp/one/'
* commend.add("第1条命令 && 第2条命令 && 第3条命令 ..."); //这里可以实现执行多条linux命令
* Process process = ProcessBuilder.exec(commend);
* String message = ProcessBuilder.getOutput(process);
* String error = ProcessBuilder.getError(process);
* ProcessBuilder.destroy(process);