有时候要使用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调用Lua脚本是一种常见的跨语言交互技术,特别是在游戏开发和自动化脚本编写中。本文将详细介绍如何在Java环境中使用LuaJava库进行交互,并在Linux系统上进行安装和编译。 首先,让我们理解LuaJava。LuaJava是...
本文将详细探讨如何在Java程序中调用Linux shell脚本,并解释相关的关键概念和步骤。 首先,调用shell脚本的基本过程分为以下几个步骤: 1. **设置脚本执行权限**:在Linux系统中,执行一个文件(如shell脚本)...
Linux系统下的jdk解压及配置环境脚本 具体步骤: 1.使用chmod +x jdk.sh赋予可执行权限 2.确保在root环境下运行该脚本 3.将该脚本与*.tar.gz放于同一文件夹 4.输入文件名称时请不要输入.tar.gz
总之,Java调用Shell脚本是一个有效的方法来在Java程序中实现复杂的Linux环境下的操作,这种技术尤其适用于需要进行系统级操作和自动化任务的场景。掌握这一技术可以帮助开发者更好地实现跨平台的功能,尤其是在开发...
本资源主要涉及两个核心知识点:Java项目的Linux启动脚本和日志分割工具cronolog。 首先,让我们来深入理解Java项目的Linux启动脚本。在SpringBoot这样的微服务架构中,通常需要编写自定义的Shell脚本来实现服务的...
在`java程序中调用linux命令.txt`文件中,可能包含了如何在Java程序中直接调用Linux命令的示例代码。通常,我们可以使用`Runtime.getRuntime().exec()`或`ProcessBuilder`类来执行命令。例如: ```java Process ...
在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell...
本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术点和步骤。 首先,我们需要理解Java中的SSH(Secure Shell)框架,它允许我们在安全的...
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如自动化运维、文件管理等,这时就可能需要用到调用Shell脚本。本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的...
根据提供的文件信息,本文将详细解释如何在Linux系统中配置Java环境变量,并确保其正确运行。这主要包括以下几个方面的内容: ### Java环境配置 #### 删除旧配置 在进行新配置之前,通常需要先删除已存在的旧配置...
本文将详细介绍如何使用Java调用Linux命令,以满足特定场景的需求,如文中提到的通过Java接口重启keepalived服务。首先,我们将理解Java调用Linux命令的基本原理,然后通过具体的代码示例来展示实现这一功能的过程。...
### Java调用Shell脚本详解 #### 一、前言 在实际开发过程中,经常会遇到需要结合Java程序与Shell脚本进行操作的情况。通过Java调用Shell脚本不仅可以实现复杂的功能,还可以提高程序的灵活性和扩展性。本文将详细...
在实际应用中,可以通过命令行调用这些脚本,结合其他Linux工具(如grep、awk等)进行进一步的数据分析和处理。例如,可以将"show-busy-java-threads"的输出与性能监控数据相结合,找出性能瓶颈;"show-duplicate-...
这篇博客“Linux 自动添加JAVA环境脚本”显然介绍了一个用于自动配置Linux系统中的Java环境的shell脚本,名为`javaPathShell.sh`。下面将详细阐述相关知识点。 1. **Java环境变量**: - **JAVA_HOME**: 这是一个...
本文将详细讲解如何在Linux和Windows操作系统下动态设置classpath以调用Java类方法,并提供实际示例和文档。 一、Linux环境下设置classpath 在Linux系统中,你可以通过以下几种方式设置classpath: 1. **命令行...
一、Linux系统Java服务自启动shell脚本 自启动脚本主要目的是在Linux系统启动时自动启动Java服务,确保服务的高可用性。创建自启动脚本通常包括以下步骤: 1. 创建shell脚本:在系统的`/etc/init.d/`目录下创建一...