`
envoydada
  • 浏览: 65372 次
社区版块
存档分类
最新评论

Java调用Linux命令

阅读更多

Java可以直接调用Linux命令,形式如下:
 Runtime.getRuntime().exec(command)

 举例:运行ls,top命令可以这样:
 Runtime.getRuntime().exec("ls");

 但是这样执行时没有任何输出,原因: 
 调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,
(注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例),
该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向子进程输入数据或获取子进程的输出. 可以采用如下方法:

try
{
 Process process = Runtime.getRuntime().exec ("ls"); 

 InputStreamReader ir=newInputStreamReader(process.getInputStream());
 LineNumberReader input = new LineNumberReader (ir);

 String line;
 while ((line = input.readLine ()) != null){
  System.out.println(line)
}
catch (java.io.IOException e){
 System.err.println ("IOException " + e.getMessage());
}

分享到:
评论
2 楼 fandayrockworld 2012-01-07  

p.waitFor();

avery_leo 写道
Java代码
public static double[] getMemUsage() throws Exception {  
 
        double[] result = new double[4];  
          
        Process p = rt.exec("free -m");// 调用系统的命令  
          
        BufferedReader in = null;  
        try {  
            in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
            String str = null;  
            String[] strArray = null;  
 
            while ((str = in.readLine()) != null) {  
                 

public static double[] getMemUsage() throws Exception {

double[] result = new double[4];

Process p = rt.exec("free -m");// 调用系统的命令

BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
String[] strArray = null;

while ((str = in.readLine()) != null) {
Java代码
        int m = 0;  
 
        if (str.indexOf("/") != -1) {// MemUsed  
                                                    strArray = str.split(" ");  
            for (String tmp : strArray) {  
                if (tmp.trim().length() == 0)  
                    continue;  
 
                if (++m == 3) {  
                                                result[1] = Double.parseDouble(tmp);  
 
                }  
            }  
 
        }  
        if (str.indexOf("Mem") != -1) {// MemTotal  
 
            strArray = str.split(" ");  
            for (String tmp : strArray) {  
                if (tmp.trim().length() == 0)  
                    continue;  
 
                if (++m == 2) {  
 
                    result[0] = Double.parseDouble(tmp);  
 
                }  
            }  
 
        }  
    }  
    p.getErrorStream();  
} catch (Exception e) {  
    e.printStackTrace();  
} finally {  
    in.close();  
    p.destroy();  
}  
// System.out.println("Performance Monitoring menUsed:" + result[1]);  
return result;  

int m = 0;

if (str.indexOf("/") != -1) {// MemUsed
strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;

if (++m == 3) {
result[1] = Double.parseDouble(tmp);

}
}

}
if (str.indexOf("Mem") != -1) {// MemTotal

strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;

if (++m == 2) {

result[0] = Double.parseDouble(tmp);

}
}

}
}
p.getErrorStream();
} catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
p.destroy();
}
// System.out.println("Performance Monitoring menUsed:" + result[1]);
return result;
}


在一个线程(假设1毫秒一次)中,无限循环执行上面的代码:



大概20分钟左右后出现如下异常:



java.io.IOException: Cannot run program "free": java.io.IOException: error=24, Too many open files
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
        at java.lang.Runtime.exec(Runtime.java:593)
        at java.lang.Runtime.exec(Runtime.java:431)
        at java.lang.Runtime.exec(Runtime.java:328)
        at LinuxSystemTool.getMemUsage(LinuxSystemTool.java:98)
        at LinuxSystemTool.exec(LinuxSystemTool.java:67)
        at LinuxSystemTool.run(LinuxSystemTool.java:42)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.IOException: java.io.IOException: error=24, Too many open files
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
        at java.lang.ProcessImpl.start(ProcessImpl.java:65)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
        ... 7 more



查看网络相关资料,大概了解可能是由于打开的句柄过多造成,也没有找到解决办法,不吝赐教,谢谢

1 楼 avery_leo 2009-01-04  
Java代码
public static double[] getMemUsage() throws Exception {  
 
        double[] result = new double[4];  
          
        Process p = rt.exec("free -m");// 调用系统的命令  
          
        BufferedReader in = null;  
        try {  
            in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
            String str = null;  
            String[] strArray = null;  
 
            while ((str = in.readLine()) != null) {  
                 

public static double[] getMemUsage() throws Exception {

double[] result = new double[4];

Process p = rt.exec("free -m");// 调用系统的命令

BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
String[] strArray = null;

while ((str = in.readLine()) != null) {
Java代码
        int m = 0;  
 
        if (str.indexOf("/") != -1) {// MemUsed  
                                                    strArray = str.split(" ");  
            for (String tmp : strArray) {  
                if (tmp.trim().length() == 0)  
                    continue;  
 
                if (++m == 3) {  
                                                result[1] = Double.parseDouble(tmp);  
 
                }  
            }  
 
        }  
        if (str.indexOf("Mem") != -1) {// MemTotal  
 
            strArray = str.split(" ");  
            for (String tmp : strArray) {  
                if (tmp.trim().length() == 0)  
                    continue;  
 
                if (++m == 2) {  
 
                    result[0] = Double.parseDouble(tmp);  
 
                }  
            }  
 
        }  
    }  
    p.getErrorStream();  
} catch (Exception e) {  
    e.printStackTrace();  
} finally {  
    in.close();  
    p.destroy();  
}  
// System.out.println("Performance Monitoring menUsed:" + result[1]);  
return result;  

int m = 0;

if (str.indexOf("/") != -1) {// MemUsed
strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;

if (++m == 3) {
result[1] = Double.parseDouble(tmp);

}
}

}
if (str.indexOf("Mem") != -1) {// MemTotal

strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;

if (++m == 2) {

result[0] = Double.parseDouble(tmp);

}
}

}
}
p.getErrorStream();
} catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
p.destroy();
}
// System.out.println("Performance Monitoring menUsed:" + result[1]);
return result;
}


在一个线程(假设1毫秒一次)中,无限循环执行上面的代码:



大概20分钟左右后出现如下异常:



java.io.IOException: Cannot run program "free": java.io.IOException: error=24, Too many open files
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
        at java.lang.Runtime.exec(Runtime.java:593)
        at java.lang.Runtime.exec(Runtime.java:431)
        at java.lang.Runtime.exec(Runtime.java:328)
        at LinuxSystemTool.getMemUsage(LinuxSystemTool.java:98)
        at LinuxSystemTool.exec(LinuxSystemTool.java:67)
        at LinuxSystemTool.run(LinuxSystemTool.java:42)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.IOException: java.io.IOException: error=24, Too many open files
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
        at java.lang.ProcessImpl.start(ProcessImpl.java:65)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
        ... 7 more



查看网络相关资料,大概了解可能是由于打开的句柄过多造成,也没有找到解决办法,不吝赐教,谢谢

相关推荐

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

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

    java调用linux系统命令

    java调用linux系统命令的封装工具类。

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

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

    java调用Linux命令获取输出流

    java调用Linux命令获取输出流,用于解决获取不到输出流的方法

    java调用linuex命令

    本文将详细探讨如何利用Java调用Linux命令,这一技能对于任何希望在Java应用中集成Linux功能的开发者来说都是至关重要的。 ### Java调用Linux命令的方法 Java提供了多种方式来执行外部命令或脚本,其中最常用的是...

    14-Java操作Linux命令分割合并文本文件1

    2. **Java调用Linux命令** - 在Java中,可以通过`Runtime.getRuntime().exec()`或`ProcessBuilder`类来执行Linux命令。在描述中提到的`getDiskUsage`方法就使用了`ProcessBuilder`来执行`df -hl -P`命令,获取磁盘...

    在Linux系统下用java执行系统命令实例讲解

    在Linux系统下,Java编程语言提供了丰富的API来执行操作系统级别的命令。这主要通过`java.lang.Runtime`类和`java.lang.ProcessBuilder`类实现。本文将深入讲解如何在Java程序中调用Linux命令,并通过实例来阐述这一...

    java执行linux命令,java调用linux脚本文件,java启动停止发布tomcat,servlet ajax文件上传

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

    Java 调用 Linux shell 命令执行框架:sshxcute

    sshxcute 就是这样一个框架工具集,它基于 JSCH 构建,允许工程师利用Java 代码通过 SSH 连接远程批量执行 Linux/UNIX 系统上的命令或者脚本,同时加入了判断成功与否,取回输出等多种实用功能。sshxcute 不管是针对...

    使用java远程调用Linux命令_java-linux-command.zip

    使用java远程调用Linux命令_java-linux-command

    Java调用Linux CenterOS系统安装的OpenOffice4报错

    在这个特定的问题"Java调用Linux CentOS系统安装的OpenOffice4报错"中,开发者可能在尝试使用Java来自动化处理文档,如转换Office格式,而OpenOffice4提供了一个开源的解决方案,可以将Microsoft Office文档转换为...

    java连接linux,执行shell命令的工具类 sshxcute.jar

    SSHXCUTE.jar是一个Java库,它允许程序员通过SSH连接到Linux系统并执行shell命令,而无需深入了解SSH的底层细节。 SSHXCUTE.jar的核心功能包括: 1. **建立SSH连接**:通过提供主机名、用户名、密码或密钥对信息,...

    java代码执行linux系统命令

    java代码执行linux系统命令

    Java中常用的Linux命令.docx

    Java中常用的Linux命令 Linux命令是Java开发中不可或缺的一部分,掌握这些命令可以提高开发效率和解决问题的能力。本文总结了常用的Linux命令,涵盖文件管理、进程管理、网络管理、文件传输和其他方面。 文件管理 ...

    java调用DOS命令

    Java调用DOS命令是指在Java程序中执行操作系统级别的命令,比如Windows下的CMD命令或Linux下的Shell命令。这种功能在很多场景下都很有用,比如自动化脚本、文件操作、系统管理等。Java提供了Runtime类和...

    java通过代码登录远程linux服务器并执行linux命令源码以及jar包

    总的来说,Java通过JSch库远程登录Linux服务器并执行命令,是Java与Linux系统交互的一种常用方式,尤其适用于自动化运维和脚本化的任务。通过理解并实践这些代码,你将能够更好地理解和掌握Java进行远程操作的能力。

    java应用程序远程登录linux并执行其命令

    在Java编程环境中,远程登录Linux系统并执行命令是一项常见的任务,尤其在自动化运维、系统管理以及分布式系统中。本文将详细讲解如何实现这一功能,并基于给出的“AutoStart”文件名,推测这是一个自动启动相关服务...

    java 调用doc命令

    在Unix或Linux系统中,你可能会使用`libreoffice --view`或者`open`命令来打开.doc文件。 总的来说,Java调用doc命令涉及了Java与操作系统交互的能力,这在系统集成、自动化测试或文件处理场景中非常常见。正确理解...

    Java语言编写的Linux简单命令解释器

    本项目专注于使用Java语言构建一个针对Linux操作系统的简单命令解释器,这为理解这两者的结合提供了一个实用的学习平台。以下是关于这个项目的详细知识点: 1. **Java语言**:Java是一种跨平台的面向对象的编程语言...

Global site tag (gtag.js) - Google Analytics