有时候要使用Java调用linux脚本,且需要设置超时时间,以下是我封装的简单的类:
超时使用Thread.join(time)来实现。
public class ProcessUtils { /** * @parma taskName 任务名 * @param processName 进程名 * @param cmd * @param timeout * 超时时间,如果为0则表示永远不超时 * @return */ public static boolean execute(String taskName, String processName, String[] cmd, long timeout) { BufferedReader infoReader = null; BufferedReader errorReader = null; StringBuilder errorMsg = new StringBuilder(); Process process = null; TimeoutWorker worker = null; try { process = Runtime.getRuntime().exec(cmd); infoReader = new BufferedReader(new InputStreamReader( process.getInputStream())); errorReader = new BufferedReader(new InputStreamReader( process.getErrorStream())); worker = new TimeoutWorker(process); worker.start(); worker.join(timeout);//超时时间到或者run方法执行完成(即process.waitFor执行完成)时就会向下执行 if (worker.status != null) { // info数据 String line = null; while (infoReader != null && (line = infoReader.readLine()) != null) { System.out.println(line); } // error数据 while (errorReader != null && (line = errorReader.readLine()) != null) { errorMsg.append(line).append("\n"); } if (!errorMsg.toString().isEmpty()) { System.out.println(errorMsg.toString()); } }else{//超时 System.out.println(processName + " timeout, timeout is "+ timeout+"..."); } } catch (InterruptedException e) { if (worker != null) { worker.interrupt(); } Thread.currentThread().interrupt(); } catch (Exception e) { e.printStackTrace(); } finally { if (process != null) { process.destroy(); } } return false; } /** * 用于设置超时的线程 * */ private static class TimeoutWorker extends Thread { private Process process; private Integer status; public TimeoutWorker(Process process) { this.process = process; } public void run() { try { status = process.waitFor(); } catch (InterruptedException e) { return; } } } }
但如ps -ef|grep tomcat的脚本用以上的方法是解决不了的,需要做一些改变,即
cmd = {"ps -ef|grep tomcat"} 改成: cmd = {"/bin/sh", "-c","ps -ef|grep tomcat"}
就可以了。
网上有说:Runtime.getRuntime().exec()这种调用方式在java虚拟机中是十分消耗资源的,即使命令可以很快的执行完毕,频繁的调用时创建进程消耗十分客观。java虚拟机执行这个命令的过程是,首先克隆一条和当前虚拟机拥有一样环境变量的进程,再用这个新的进程执行外部命令,最后退出这个进程。频繁的创建对CPU和内存的消耗很大。 有空时研究下...
相关推荐
java 执行linux命令源码,java调用shell脚本源码,java web发布war到tomcat,servlet文件上传,ajax文件上传。 java web 上传war包、停止、启动、发布tomcat。 命令修改成自己的目录即可使用。
Java程序调用linux命令、脚本,支持程序在服务器上使用linux命令。工具类为:ProcessUtil,支持单个命令和批量命令执行函数,同时在工具类中添加了getFileLineNumByCmd函数支持通过linux命令获取文件行数的样例。
详细的linux shell脚本启动java代码类。
主要介绍了Java调用linux shell脚本的方法,需要的朋友可以参考下
Linux系统下的jdk解压及配置环境脚本 具体步骤: 1.使用chmod +x jdk.sh赋予可执行权限 2.确保在root环境下运行该脚本 3.将该脚本与*.tar.gz放于同一文件夹 4.输入文件名称时请不要输入.tar.gz
在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell...
JAVA操作linux服务器,本文用于启动shell脚本并返回数据,简单易懂,可随时修改,1.连接服务器。2.输入服务器地址。3.输入用户名和密码。4.输入要执行的命令。
在Java程序中调用Unix/Linux主机上的Shell命令,并返回相应执行结果。
sshxcute 就是这样一个框架工具集,它基于 JSCH 构建,允许工程师利用Java 代码通过 SSH 连接远程批量执行 Linux/UNIX 系统上的命令或者脚本,同时加入了判断成功与否,取回输出等多种实用功能。sshxcute 不管是针对...
解决有java调用shell脚本需求的童鞋们,包含一些调用的测试方法,有问题可留言回复。
NULL 博文链接:https://chamcon.iteye.com/blog/1972995
使用runtime, 实现java客户端多次调用linux命令或者shell脚本,并返回对应结果或信息
该工具包可实现远程调用Shell脚本,可帮助您轻松实现java远程调用Shell脚本
在开发过程中经常会员到在Linux环境中使用Shell脚本启动和停止java程序的情况,常用的java -jar命令只能运行jar文件,有很多不方便的地方,一旦代码修改就需要重新编辑打包,其实还有很多其他的方式,这个资源中包含...
附操作使用文档和3个脚本文件,可以快速一键使用linux命令部署java环境和所需工具方便快捷.jdk1.8.0_201+tomcat9.0.16+mysql
linux 一键启动 jar包 批处理脚本,适用于java 项目,spring boot 一键启动,停止,重启 等,代码简洁,可直接使用.
linux中java项目需要重启一般使用先找到进程杀掉进程,然后找到项目启动,整个过程不算复杂,但是每次都操作一遍太麻烦,我这里把这个过程整理成shell脚本,大家可以修改里面项目名称,每次直接执行这个命令重启项目...
在linux和windows下动态设置classpath调用java类方法,绝对简单实用.包括实例子和文档.