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();
}
}
Process 执行shell 脚本的更多相关文章
- Java SSH远程执行Shell脚本实现(转)
前言 此程序需要ganymed-ssh2-build210.jar包(下载地址:http://www.ganymed.ethz.ch/ssh2/) 为了调试方便,可以将\ganymed-ssh2-bu ...
- Scala进阶之路-进程控制之执行shell脚本
Scala进阶之路-进程控制之执行shell脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,我这里直接放一个案例. /* @author :yinzhengjie ...
- Android程序执行shell脚本
在做Android应用时,经常需要执行shell脚本,以快速实现某些功能: 在Android应用程序中执行shell脚本可以省去一大堆繁琐的代码,还可以避免不必要的错误: 比如:拷贝文件夹时,可以执行 ...
- Java执行Shell脚本
Linux 系统下采用 Java 执行 Shell 脚本,直接上代码: package com.smbea.demo; import java.io.BufferedReader; import ja ...
- java连接ssh执行shell脚本
在liunx上写了一个shell脚本,想通过java去调用这个shell脚本,不知道怎么去调用,在网上说使用process这个进程方式,但是我执行机和我shell脚本都不在同一台电脑,老大说java中 ...
- Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...
- 利用java执行shell脚本
BPMN中存在由系统执行的脚本任务,shell脚本任务也是该系统任务脚本中的一种,利用的也是由java执行shell脚本. 代码中的ProcessBuilder类,为java.lang.Process ...
- Linux中执行shell脚本的4种方法总结
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
- Linux中执行shell脚本的4种方法
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
随机推荐
- truncate table和delete table 的区别
truncate table和不带 where 的 detele 功能一样,都是删除表中的所有数据. 但TRUNCATE TABLE 速度更快,占用的日志更少,这是因为 TRUNCATE TABLE ...
- javascript验证香港身份证
var assert = require('assert'); describe('test', function() { it('coc', function() { var testCard01 ...
- lisp中的cons
看到ANSI Common Lisp 第三章的游程编码时,就发现作者很准确的使用了list和cons来生成目标列表,虽然list是由cons扩展而来,区别也仅仅是最后一个元素的加入方式,于是勾起了之前 ...
- 完整的 mime type 列表
原文地址:http://blog.csdn.net/zhaoyw2008/article/details/46647723 Suffixes applicable Media type and sub ...
- ARM开发板上iconv调用失败的解决方法
当前流行的字符编码格式有:US-ASCII.ISO-8859-1.UTF-8.UTF-16BE.UTF-16LE.UTF-16.GBK.GB2312等,其中GBK.GB2312是专门处理中文编码的.而 ...
- 史航416第11次作业&总结
作业1:冒泡排序 #include <stdio.h> ],int n); int main() { ],n,i; printf("输入一个整数n:"); scanf( ...
- 查看linux中某个端口是否被占用
1.netstat -tunlp | grep **** -t--tcp -u--udp -l--listening -n --numeric -p--program -a--all 2.lsof ...
- java 中如何声明线程安全的集合 set, map 和list
线程安全的集合 http://blog.sina.com.cn/s/blog_508938e10102v1ig.html //make thread-safe list List MyStrList ...
- Tomcat8安装, 安全配置与性能优化
一.Tomcat 安装 官网:http://tomcat.apache.org/ Tomcat8官网下载地址:http://tomcat.apache.org/download-80.cgi 为了便于 ...
- Powershell获取并导出指定日期EventLog
$date = Get-Date 28/07/16 Get-EventLog -After $date "Application"|Export-Csv c:\ming.csv