榆社县济南网站建设公司 大学,青岛住房和城乡建设厅网站首页,企业网站翻译,电商网站要素概述#xff1a; Process类是一个抽象类#xff08;所有的方法均是抽象的#xff09;#xff0c;封装了一个进程#xff08;即一个执行程序#xff09;。 Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁#xff08;杀掉 Process类是一个抽象类所有的方法均是抽象的封装了一个进程即一个执行程序。 Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁杀掉进程的方法。 ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程并返回 Process 子类的一个实例该实例可用来控制进程并获取相关信息。创建的子进程没有自己的终端或控制台。它的所有标准 io即 stdinstdoutstderr操作都将通过三个流 (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(); rsIOUtils.getStringFromReader(new BufferedReader(new InputStreamReader(in,GBK))); rsrs.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(); } }