• Process 执行shell 脚本


    概述:

     Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。
     Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。
     ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程,通过流的形式进行读取。

    API:

    destroy() 
       杀掉子进程。 
     exitValue() 
       返回子进程的出口值。 
     InputStream getErrorStream() 
       获得子进程的错误流。 
     InputStream getInputStream() 
       获得子进程的输入流。 
     OutputStream getOutputStream() 
       获得子进程的输出流。 
     waitFor() 
       导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止

     注意:

          1.destroy()杀掉子线程的状态在五分钟后进程才会消失

        2.执行linux命令,若命令包含一些特殊字符,需要封装ProcessBuilder 来获取Process对象

    public class Command extends Thread {
    private Log logger = LogFactory.getLog(Command.class);

    /**
    * 判断线程是否执行完毕
    */
    public boolean isCompletion;

    /**
    * 本地线程对象
    */
    public Process process;
    /**
    * 执行结果
    */
    public String rs="";

    private ShellExecReq req;

    public Command(ShellExecReq req) {
    this.req = req;
    this.isCompletion = false;
    }

    /**
    * @see java.lang.Runnable#run()
    */
    @Override
    public void run() {
    try {
    ProcessBuilder p = new ProcessBuilder("/bin/bash", "-c", req.getCommand());
    process = p.start();
    InputStream in = process.getInputStream();
    rs=IOUtils.getStringFromReader(new BufferedReader(new InputStreamReader(in,"GBK")));
    rs=rs.replaceAll("[\x00-\x08\x0b-\x0c\x0e-\x1f]", "");
    logger.info("执行脚本返回结果:"+rs);
    in.close();
    //程序执行完毕
    isCompletion = true;
    InputStream input = process.getErrorStream();
    if (input != null) {
    if (StringUtils.isBlank(rs)) {
    rs = IOUtils.getStringFromReader(new BufferedReader(
    new InputStreamReader(input)));
    }
    logger.error(IOUtils.getStringFromReader(new BufferedReader(new InputStreamReader(
    input))));
    }
    } catch (IOException e) {
    rs = ShellExecErrorMessage.execerror;
    logger.error("执行脚本发生异常:" + e.getMessage(), e);
    }
    }

    /**
    * 中断运行线程
    * @author Yang Xue 2014年10月31日
    */
    public void kill() {
    //终止服务器线程运行
    this.process.destroy();
    //中断线程
    this.interrupt();
    }
    }

  • 相关阅读:
    今日小结
    Delphi 框架Frames的使用
    Delphi窗体显示后弹出一个对话框的方法
    Structs2学习笔记1
    使用 LaravelExcel 进行 CSV/EXCEL 文件读写
    Mysql函数FIND_IN_SET()的使用方法
    Laravel数据库操作的三种方式
    Laravel5.5 支付宝手机网站支付的教程
    Python之路3【知识点】白话Python编码和文件操作
    艾伟_转载:利用jQuery实现的Ajax 验证用户名是否存在 狼人:
  • 原文地址:https://www.cnblogs.com/Snowflake/p/4137331.html
Copyright © 2020-2023  润新知