JAVA执行Shell脚本

执行Shell脚本时需要注意的几项(本人理解,大家有不同的意见欢迎补充):

 

1、可以获取脚本输出到控制台的内容,不能够直接获取return的值;

 

2、 如果不知道服务器上脚本是否有可执行权限,可以通过“sh 脚本”执行;

 

3、如果脚本有参数,在参数上加上双引号防止参数值为空情况;

 

4、如果脚本需要限定目录执行,可以通过“cd 目录 && sh 脚本”执行;

 

直接提供本人在项目中写的Shell脚本工具类,代码如下:

package util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

import org.apache.log4j.Logger;

/**
 * Shell脚本工具类
 *
 * @author Jinlong Wu
 * @version 
 * @since 
 */
public class ShellUtil
{
    /**
     * 日志实例
     */
    private static Logger log = Logger.getLogger(ShellUtil.class);

    /**
     * Shell类型
     */
    public static final String SHELL_TYPE = "/bin/sh";

    /**
     * 线程等待超时时间
     */
    public static final long PROCESS_TIMEOUT = 3000;

    /**
     *
     * 执行Shell脚本
     *
     * @author Jinlong Wu
     * @param shellScript
     *            Shell脚本
     * @return 脚本执行结果
     */
    public static String exec(String shellScript)
    {
        return exec(shellScript, PROCESS_TIMEOUT);
    }

    /**
     *
     * 执行Shell脚本
     *
     * @author Jinlong Wu
     * @param shellScript
     *            Shell脚本
     * @param timeout
     *            脚本执行等待时间
     * @return 脚本执行结果
     */
    public static String exec(String shellScript, long timeout)
    {
        // 命令执行失败,默认返回-1
        String result = "-1";

        // 命令执行线程数据读取器
        BufferedReader br = null;
        try
        {
            // 执行Shell脚本
            Process process = Runtime.getRuntime().exec(new String[]
            {SHELL_TYPE, "-c", shellScript});
            synchronized (process)
            {
                // 获取执行结果
                br = new LineNumberReader(new InputStreamReader(process
                        .getInputStream()));

                // 等待线程响应结果
                process.wait(timeout);

                // 读取脚本执行结果
                StringBuffer sb = new StringBuffer();
                String line;
                while ((line = br.readLine()) != null)
                {
                    sb.append(line);
                }
                result = sb.toString();
            }
        }
        catch (IOException e)
        {
            log.error("Execute the script[" + shellScript + "] failed.", e);
        }
        catch (InterruptedException e)
        {
            log.error("Execute the script[" + shellScript + "] failed.", e);
        }
        finally
        {
            if(null != br)
            {
                try
                {
                 br.close();
                }
                catch (Exception e)
                {
                   log.error(e);
                }
            }
        }
        return result;
    }

    /**
     *
     * 执行Shell脚本
     *
     * @author Jinlong Wu
     * @param shellScript
     *            Shell脚本
     * @param timeout
     *            脚本执行等待时间
     * @param paras
     *            脚本参数
     * @return 脚本执行结果
     */
    public static String exec(String shellScript, long timeout, String... paras)
    {
        StringBuffer sb = new StringBuffer();
        sb.append(shellScript);
        if (null != paras && paras.length > 0)
        {
            for (String str : paras)
            {
                sb.append(" ").append("\"").append(str).append("\"");
            }
        }
        return exec(sb.toString(), timeout);
    }

    /**
     *
     * 执行Shell脚本
     *
     * @author Jinlong Wu
     * @param shellScript
     *            Shell脚本
     * @param paras
     *            脚本参数
     * @return 脚本执行结果
     */
    public static String exec(String shellScript, String... paras)
    {
        StringBuffer sb = new StringBuffer();
        sb.append(shellScript);
        if (null != paras && paras.length > 0)
        {
            for (String str : paras)
            {
                sb.append(" ").append("\"" + str + "\"");
            }
        }
        return exec(sb.toString());
    }
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值