Java操作shell脚本
public class Exec {
private static ILogger logger = LoggerFactory.getLogger(Exec.class);
public Exec() {
super();
}
/**
* 执行命令(如Shell脚本)<br>
*
* @param cmd 操作命令
* @param timeout 超时时间
* @return 命令执行过程输出内容
*
* @throws IOException
* @throws TimeoutException
* @throws InterruptedException
*/
public String execute(final String cmd, final long timeout) throws IOException, TimeoutException, InterruptedException{
if(cmd == null || cmd.trim().length() == 0) {
return null;
}
long time = 1000L * 5;
time = timeout > 0 ? timeout : time;
long begin = System.currentTimeMillis();
logger.info("Begin execute command { " + cmd + " }, timeout = " + time + " seconds.");
//执行命令
Process process = Runtime.getRuntime().exec(cmd);
TimeWorker timeWorker = new TimeWorker(process);
process.getOutputStream().close();
OutputWorker outputWorker = new OutputWorker(process.getInputStream());
String result = null;
outputWorker.start();
timeWorker.start();
try {
//任务超时
timeWorker.join(time);
if (timeWorker.exit == null) {
throw new TimeoutException(cmd);
} else if(timeWorker.exit != 0) {
logger.error("Execute command " + cmd + " error, error message: " + this.getOutput(process.getErrorStream()));
result = "error";
} else {
result = outputWorker.output;
}
} catch (InterruptedException e) {
timeWorker.interrupt();
Thread.currentThread().interrupt();
throw e;
} finally {
process.destroy();
}
long end = System.currentTimeMillis();
logger.info("Finish execute command { " + cmd + " }, time spent " + (end - begin)/1000L + " seconds.");
return result;
}
/**
* 获取IO输出内容 <br>
*
* @param stream 流
* @return 内容
* @throws IOException
*/
private String getOutput(InputStream stream) throws IOException {
if(stream == null) {
return null;
}
StringBuffer buffer = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String line = null;
while((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
reader.close();
return buffer.toString().trim();
}
/**
*
* @author
*
*/
private static class OutputWorker extends Thread {
private final InputStream stream;
private String output = null;
private OutputWorker(InputStream stream) {
this.stream = stream;
}
public void run() {
String line = null;
StringBuffer buffer=new StringBuffer();
BufferedReader reader=null;
try {
reader = new BufferedReader(new InputStreamReader(stream));
while((line = reader.readLine()) != null) {
buffer.append(line+"\n");
}
this.output = buffer.toString().trim();
} catch (IOException e) {
logger.error(e.getMessage());
} finally {
if(reader!=null) {
try {
reader.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
}
}
/**
*
* @author
*
*/
private static class TimeWorker extends Thread {
private final Process process;
private Integer exit = null;
private TimeWorker(Process process) {
this.process = process;
}
public void run() {
try {
//阻塞等待命令执行结束
exit = process.waitFor();
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
}
}
}
Java操作shell脚本相关推荐
- 脚本运行显示服务器超时,java执行shell脚本超时
java执行shell脚本超时 [2021-02-11 04:20:34] 简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...
- java无阻塞执行脚本,JAVA调用Shell脚本-及阻塞的解决方法
JAVA调用Shell脚本--及阻塞的解决办法 用java调用shell,使用 Process p=Runtime.getRuntime().exec(String[] cmd); Runtime.e ...
- Java操作linux脚本
近期在实现Java调用linux命令及脚本实现数据的批处理,文件的生成,下面记录下我所有遇见的问题 1.sqlplus ip等配置 1.sqlplus username/password 连接本机数据 ...
- shell监控java接口服务_Linux系统下Java通过shell脚本监控重启服务
简介 最近运维人员提出需求,增加一个运维页面, 查询当前的业务进程信息包括:进程名称.启动命令.启动时间.运行时间等,可以通过页面点击重启按钮,可以重启后端的一系列系统进程. 思路 java程序获取l ...
- java调用shell脚本及注意事项
需求: get方法下载远程zip包,然后zip包解压,取出第一级目录再次进行压缩获取新的压缩zip包. 问题: 如果选择使用java代码的IO流操作,在不确定zip包大小的情况下可能会占用很大的内存, ...
- java调用shell脚本_Java 执行Shell脚本指令
一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...
- java执行shell脚本 process.waitFor()返回1
记录一下今天遇到的一个问题 在java代码中执行shell脚本,部分代码如下 Process p = null; List<String> cmds = new ArrayList< ...
- JAVA调用shell脚本实例
2019独角兽企业重金招聘Python工程师标准>>> ~/testcode/HelloWorld.java源码文件 1 public class HelloWorld{ 2 ...
- java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例
java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...
最新文章
- select sqlite 唯一_SQLite Select 语句
- [HNOI2009]最小圈 (二分答案+负环)
- js中加载指定的html代码,在js或JQuery中怎样判断页面html代码中含有指定名称的div元素...
- mysql group concat_MySQL 的 GROUP_CONCAT 函数详解
- Codeplus2017 12月赛——可做题1
- C++算法学习(力扣:134. 加油站)
- 资料:线性代数与空间解析几何知识点全汇总
- ActiveX插件在关闭IE窗口时使得IE崩溃
- android文件恢复,安卓手机文件丢失了,如何恢复?
- 中国联通广州软件研究院 软件开发岗二面(技术面)
- 骑行听音乐用什么耳机,盘点几款适合在出行佩戴的耳机
- 【经历分享】三本大学小菜鸡,最后四个月自学编程经验分享
- php generator 风雪,PHP 生成器Generator理解
- Linux——Linux账号与群组
- 免费的mysql空间
- SAP:MIGO校验自定义字段增强
- 虚幻四视角移动与场景搭建
- 视频压缩 ffmpeg
- 太阳同步轨道卫星 理解内容
- 计算机网络原理综合考核,计算机网络原理考试重点
热门文章
- 关于怎么怎么把 unsingned char 数据转换为 Opencv 的Mat类型,并且吧图像显示出来
- 密码学入门1——凯撒密码和三重DES加解密
- jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧
- opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...
- angular接口传参
- 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...
- PHP常用的正则表达式(有些需要调整)
- 如何查看数据文件或者Log文件是否增长过?
- Weblogic EJB 学习笔记(3)精
- php源码编程,10个小技巧让你做好php源码编程