java调用shell脚本工具类

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;
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值