下文所述的两个试验在Linux AS3和Jdk5上测试通过。
一、在java程序中跨平台运行shell命令或者脚本,并获得其输出
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TestCMD {
/**
* @param args
*/
public static void main(String[] args) {
try {
Process child = null;
String systemType = System.getProperty("os.name");
if (systemType.equals("Linux")) {
System.out.println("Linux OS!");
child = Runtime.getRuntime().exec("jmap -h", null, null);
} else if (systemType.indexOf("Windows") > -1) {
// If the os is windows, you need to add cmd before command.
System.out.println("Windows OS!");
child = Runtime.getRuntime().exec("cmd java -version", null,
null);
}
// Get the input stream and read from it
BufferedReader in = new BufferedReader(new InputStreamReader(child
.getInputStream()));
String c = null;
while ((c = in.readLine()) != null) {
System.out.println(c);
}
in.close();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、推广:根据某个进程特殊的tag获得其进程ID
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
* @(#)TestGetPid.java 2008-5-21
*
* Copyright (c) 2008
* All rights reserved.
* $
*/
/**
* <strong>Purpose:</strong><br>
* TODO.
*
* @version 1.0.1 2008-5-21<br>
* @author AxisThinker<br>
* @email ddjoke@163.com
*/
public class TestGetPid {
/**
* @param args
*/
public static void main(String[] args) {
try {
Process child = null;
String systemType = System.getProperty("os.name");
if (systemType.equals("Linux")) {
// If the os is linux, you need to add bash before command.
System.out.println("Support Linux os!");
child = Runtime.getRuntime().exec("ps -Af", null, null);
} else if (systemType.indexOf("Windows") > -1) {
System.out.println("Not support windows!");
}
// Get the input stream and read from it
BufferedReader in = new BufferedReader(new InputStreamReader(child
.getInputStream()));
String c = null;
// Only get the first line of bash's output.
while ((c = in.readLine()) != null) {
//这里this.name=GOS.CORE就是我要找的某个进程的特殊tag,各位可以换成你想找的进程
if (c.contains("this.name=GOS.CORE")) {
c = c.substring(c.indexOf(" "), c.length());
c = c.trim();
c = c.substring(0, c.indexOf(" "));
c = c.trim();
System.out.println(c);
break;
}
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
三: 高级应用: 通过ssh的配置,远程调用其他主机的命令,并在本地得到其输出,中间不用输入密码
第一步:需要配置ssh。配置方法简要如下:
首先,例如我想用本地的lxy账户登陆远程节点A的lxy1账户,那么首先进入本地/home/lxy目录,在这个目录下有一个隐藏目录.ssh,进入这个目录,利用ssh-keygen命令来生成本用户的公私钥对,可以利用-t参数来指定生成方法:一般用rsa方法。此时,会要求你输入key的密码,直接回车就可以。如果你输的话,就一定要输入4位以上的密码,而且,以后你用ssh的时候就要输入这个密码。所以,建议不输入。
然后会在.ssh目录下生成两个文件,例如id_rsa和id_rsa.pub,利用vi拷贝id_rsa.pub中的内容到远程节点A的lxy1账户目录下的.ssh目录里面的authorized_keys文件里。这样,以后你在本地以lxy用户身份利用ssh命令用节点A的lxy1账号登陆A节点,就不用再输入密码了。而且,执行:ssh lxy1@A ls 就能直接返回远程节点A的/home/lxy1/目录结构,不用输入密码。
第二步:编写程序
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
*Author: AxisThinker
*Email: ddjoke@163.com
*/
public class TestCMD {
/**
* @param args
*/
public static void main(String[] args) {
try {
Process child = null;
String systemType = System.getProperty("os.name");
if (systemType.equals("Linux")) {
System.out.println("Linux OS!");
child = Runtime
.getRuntime()
.exec(
"ssh gos@10.61.0.215 bash -c \"$JAVA_HOME/bin/jmap -heap 10191\"");
//这里有两点需要注意:第一你要运行的命令需要用bash -c引导。这样是告诉shell,后面的是一条指令,并且要在远端解释环境变量;二是要用转义\"来讲这个指令包起来,否则的话远端会以为jmap是一个指令,-heap是一个指令等等。
} else if (systemType.indexOf("Windows") > -1) {
// If the os is windows, you need to add cmd before command.
System.out.println("Windows OS!");
child = Runtime.getRuntime().exec(
new String[] { "cmd", "java", "-version" }, null, null);
}
// Get the input stream and read from it
BufferedReader in = new BufferedReader(new InputStreamReader(child
.getInputStream()));
String c = null;
while ((c = in.readLine()) != null) {
System.out.println(c);
if (c.equals("XXX")) {//这里比较重要,由于c = in.readLine()容易发生阻塞,所以,这里用比较土的办法来解决,根据最后一行的返回值来决定其是否退出。
break;
}
}
in.close();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
在某些情况下,Java程序需要调用Shell脚本执行特定的操作,比如访问Linux系统命令或者自动化执行一些任务。本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本...
在Java编程中,有时我们需要与操作系统进行交互,执行系统级别的命令,例如在控制台执行CMD命令或者通过SSH连接远程Linux服务器执行shell命令。这在自动化脚本、系统管理或者远程监控等场景中非常常见。本篇文章将...
当需要将这两者结合时,通常是为了在Shell脚本中调用Java程序,实现更复杂的系统集成或者自动化流程。 标题"shell 脚本调用Java类"指出我们要讨论的主题是如何在Shell脚本中执行Java程序,尤其是直接调用Java类。...
Java编程语言具有跨平台的能力,这使得它在各种操作系统上都能运行。在Windows和Linux环境中,启动批处理脚本(bat)和shell脚本(sh)是常见的任务,特别是在自动化和脚本执行过程中。`RunScript.java`和`...
该压缩包文件“java程序产品包模板-内置linux和Windows通用shell启动停止脚本(无需系统安装Java运行环境).zip”提供了一套适用于Java程序的通用打包方案,特别强调了其能够在Linux和Windows操作系统上无缝运行,且不...
Java作为一种跨平台的编程语言,提供了多种方式来调用Shell脚本,实现与操作系统的交互。本文将深入探讨Java如何调用Shell脚本以及相关的知识点。 首先,Java通过Runtime类或ProcessBuilder类可以执行外部程序,...
Java 远程调用Shell脚本客户端包是一个实用的工具,专为开发者设计,使得在Java应用程序中执行远程Shell命令变得简单而高效。这个包的主要功能是通过Java代码发起对远程服务器上的Shell脚本的调用,从而实现跨平台的...
在IT行业中,Java语言因其跨平台的特性及丰富的库支持,常常被用来进行远程服务器管理。本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术...
本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的测试示例。 1. **Java与Shell脚本的桥梁:Runtime类和ProcessBuilder类** Java提供了两种主要的方式来调用外部程序,包括Shell脚本:`...
Linux以其稳定性和安全性成为了服务器平台的首选,而Java作为跨平台的编程语言,其程序在Linux上运行同样具有广泛的应用。这篇博文将深入探讨如何在Linux系统中配置Java环境并执行Java程序。 首先,确保你的Linux...
例如,使用Shell脚本来启动、停止Java应用程序,或者通过JMX接口获取运行时信息。 在“Linux云计算-Shell脚本100例@www.java1234.com.pdf”这份资料中,读者可以期待看到一系列实用的Shell脚本示例,涵盖上述提到的...
而`Java`是一种广泛使用的编程语言,适合开发跨平台的应用程序。当`Java`与`Shell`结合时,可以实现更高效、灵活的自动化任务处理。 标题"shell java"暗示了我们要讨论的是如何利用`Shell`脚本来运行和管理`Java`...
在IT领域,特别是软件开发与系统管理中,Java与Shell脚本之间的交互是常见的需求,尤其是在自动化运维、批处理任务以及跨平台应用中。本文将深入探讨如何在Java程序中调用Shell脚本,理解其背后的原理,并提供一系列...
在实际应用中,这样的Java Shell可能用于教学目的,帮助学生理解操作系统原理,或者在无法直接运行Unix/Linux系统但又需要类似功能的环境下使用。此外,对于需要在Java环境中执行脚本或集成命令行工具的开发者来说,...
在Linux环境中运行Java应用程序时,经常需要通过shell脚本来启动Java程序。这种方式不仅便于自动化部署和管理,还可以根据需求灵活调整运行参数。本文将详细介绍如何在Linux环境下编写并运行用于执行Java程序的shell...
3. **跨平台命令执行**:在Java中实现跨平台命令执行,需要考虑不同操作系统下的命令差异。例如,Linux用`ps`查找进程,Windows用`tasklist`;Linux用`kill`发送信号,Windows用`taskkill`。 4. **进程ID获取**:在...
本文将详细探讨如何在Java程序中调用Linux shell脚本,并解释相关的关键概念和步骤。 首先,调用shell脚本的基本过程分为以下几个步骤: 1. **设置脚本执行权限**:在Linux系统中,执行一个文件(如shell脚本)...
Shell脚本和Ant脚本是两种在IT行业中广泛使用的自动化工具,主要应用于Unix/Linux系统和Java项目的构建。这里我们将深入探讨这两个概念以及它们在实际工作中的应用。 首先,Shell脚本是基于Unix/Linux命令行环境的...
Java远程调用Shell是一种技术,它允许通过Java程序执行远程服务器上的操作系统命令,这在系统集成、自动化运维或跨平台任务调度中非常有用。这里,我们深入探讨如何实现这一功能,以及涉及的关键知识点。 首先,...
Java提供了`Runtime`类和`ProcessBuilder`类,这两个类都可以用来执行外部命令,包括运行批处理文件和Shell脚本。 1. **Runtime类**:`Runtime.getRuntime().exec()`方法是Java最基础的执行外部命令的方式。例如,...