java调用shell脚本
java调用shell脚本工具类
注意处理脚本输出日志问题:当执行脚本所输出的日志过于频繁时,系统io流到Java时会出现阻塞,脚本执行未报错,但会一直卡住无法结束,导致java调用一直无法返回信息,并且该脚本进程会一直占用者。
可以在调用脚本时使用异步输出执行日志/错误日志,让会频繁输出io的脚本正常执行。
import org.slf4f.Logger;
import org.slf4f.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
/**
* @author Lhw
*/
public class ShellUtils {
public java.util.logging.Logger logger = LoggerFactory.getLogger(ShellUtils.class);
public ShellUtils() {
super();
}
/**
*
* @param shellPathName 脚本全路径/脚本名称
* @param shellParams 脚本参数
* @return 脚本是否执行成功
*/
public boolean invokeShell(String shellPathName, String... shellParams) {
logger.info("shell start time:" + new LocalDateTime.now().toString());
StringBuffer shellParam = new StringBuffer();
if (shellParams != null && shellParams.length > 0) {
for (String param : shellParams) {
shellParam.append(param == null ? "" : " " + param);// 参数之间必须要有空格
}
}
String path = shellPathName + shellParam.toString();
logger.info("shell name and params:" + path);
Runtime runtime = Runtime.getRuntime();
final Process process;
try {
process = runtime.exec(path);
// 异步输出执行日志
new Thread() {
@Override
public void run() {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
StringBuffer stringBuffer = new StringBuffer();
try {
if ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line).append("\n");
}
logger.info(stringBuffer.toString());
} catch (Exception e1) {
logger.error("shell bufferedReader readLine", e1);
} finally {
try {
bufferedReader.close();
} catch (Exception e2) {
logger.error("shell bufferedReader close", e2);
}
}
}
}.start();
// 异步输出异常日志
new Thread() {
@Override
public void run() {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
StringBuffer stringBuffer = new StringBuffer();
try {
if ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line).append("\n");
}
logger.info(stringBuffer.toString());
} catch (Exception e1) {
logger.error("error by shell bufferedReader readLine", e1);
} finally {
try {
bufferedReader.close();
} catch (Exception e2) {
logger.error("error by shell bufferedReader close", e2);
}
}
}
}.start();
int status = process.waitFor();// 脚本返回状态,无异常默认返回0,异常返回其他值
if (status != 0) {// 执行失败
logger.error("execute false " + shellPathName + ",end time:" + new LocalDateTime.now().toString());
return false;
} else {// 执行成功
logger.info("execute success :" + shellPathName + ",end time:" + new LocalDateTime.now().toString());
return true;
}
} catch (Exception e) {
logger.error("invoking shell error", e);
return false;
}
}
}