`
wangzjie
  • 浏览: 74966 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用linux脚本

    博客分类:
  • java
阅读更多

有时候要使用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调用linux脚本文件,java启动停止发布tomcat,servlet ajax文件上传

    java 执行linux命令源码,java调用shell脚本源码,java web发布war到tomcat,servlet文件上传,ajax文件上传。 java web 上传war包、停止、启动、发布tomcat。 命令修改成自己的目录即可使用。

    java调用linux命令、脚本工具类.zip

    Java程序调用linux命令、脚本,支持程序在服务器上使用linux命令。工具类为:ProcessUtil,支持单个命令和批量命令执行函数,同时在工具类中添加了getFileLineNumByCmd函数支持通过linux命令获取文件行数的样例。

    linux shell脚本启动java类

    详细的linux shell脚本启动java代码类。

    Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)

    Java调用Lua脚本是一种常见的跨语言交互技术,特别是在游戏开发和自动化脚本编写中。本文将详细介绍如何在Java环境中使用LuaJava库进行交互,并在Linux系统上进行安装和编译。 首先,让我们理解LuaJava。LuaJava是...

    Java调用linux shell脚本的方法

    本文将详细探讨如何在Java程序中调用Linux shell脚本,并解释相关的关键概念和步骤。 首先,调用shell脚本的基本过程分为以下几个步骤: 1. **设置脚本执行权限**:在Linux系统中,执行一个文件(如shell脚本)...

    Linux下java环境变量配置脚本

    Linux系统下的jdk解压及配置环境脚本 具体步骤: 1.使用chmod +x jdk.sh赋予可执行权限 2.确保在root环境下运行该脚本 3.将该脚本与*.tar.gz放于同一文件夹 4.输入文件名称时请不要输入.tar.gz

    java调用shell(包含有参数的调用)

    总之,Java调用Shell脚本是一个有效的方法来在Java程序中实现复杂的Linux环境下的操作,这种技术尤其适用于需要进行系统级操作和自动化任务的场景。掌握这一技术可以帮助开发者更好地实现跨平台的功能,尤其是在开发...

    Java项目linux启动脚本以及日志分割安装软件

    本资源主要涉及两个核心知识点:Java项目的Linux启动脚本和日志分割工具cronolog。 首先,让我们来深入理解Java项目的Linux启动脚本。在SpringBoot这样的微服务架构中,通常需要编写自定义的Shell脚本来实现服务的...

    java调用shell脚本

    在`java程序中调用linux命令.txt`文件中,可能包含了如何在Java程序中直接调用Linux命令的示例代码。通常,我们可以使用`Runtime.getRuntime().exec()`或`ProcessBuilder`类来执行命令。例如: ```java Process ...

    java调用shell脚本执行sqlldr与存储过程

    在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell...

    JAVA操作linux服务器,本文用于启动shell脚本并返回数据,简单易懂,可随时修改

    本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术点和步骤。 首先,我们需要理解Java中的SSH(Secure Shell)框架,它允许我们在安全的...

    java调用shell脚本完美封装

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如自动化运维、文件管理等,这时就可能需要用到调用Shell脚本。本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的...

    java知识linux脚本

    根据提供的文件信息,本文将详细解释如何在Linux系统中配置Java环境变量,并确保其正确运行。这主要包括以下几个方面的内容: ### Java环境配置 #### 删除旧配置 在进行新配置之前,通常需要先删除已存在的旧配置...

    Java 调用 Linux 命令实战(含完整代码)1

    本文将详细介绍如何使用Java调用Linux命令,以满足特定场景的需求,如文中提到的通过Java接口重启keepalived服务。首先,我们将理解Java调用Linux命令的基本原理,然后通过具体的代码示例来展示实现这一功能的过程。...

    java调用Shell脚本.doc

    ### Java调用Shell脚本详解 #### 一、前言 在实际开发过程中,经常会遇到需要结合Java程序与Shell脚本进行操作的情况。通过Java调用Shell脚本不仅可以实现复杂的功能,还可以提高程序的灵活性和扩展性。本文将详细...

    linux实用脚本show-busy-java-threads

    在实际应用中,可以通过命令行调用这些脚本,结合其他Linux工具(如grep、awk等)进行进一步的数据分析和处理。例如,可以将"show-busy-java-threads"的输出与性能监控数据相结合,找出性能瓶颈;"show-duplicate-...

    Linux 自动添加JAVA环境脚本

    这篇博客“Linux 自动添加JAVA环境脚本”显然介绍了一个用于自动配置Linux系统中的Java环境的shell脚本,名为`javaPathShell.sh`。下面将详细阐述相关知识点。 1. **Java环境变量**: - **JAVA_HOME**: 这是一个...

    在linux和windows下动态设置classpath调用java类方法脚本代码

    本文将详细讲解如何在Linux和Windows操作系统下动态设置classpath以调用Java类方法,并提供实际示例和文档。 一、Linux环境下设置classpath 在Linux系统中,你可以通过以下几种方式设置classpath: 1. **命令行...

    linux系统java服务自启动shell脚本及服务cpu内存占用监控脚本

    一、Linux系统Java服务自启动shell脚本 自启动脚本主要目的是在Linux系统启动时自动启动Java服务,确保服务的高可用性。创建自启动脚本通常包括以下步骤: 1. 创建shell脚本:在系统的`/etc/init.d/`目录下创建一...

Global site tag (gtag.js) - Google Analytics