0 0

Process p = rt.exec("free -m")问题,不吝赐教10

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;  

在一个线程(假设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



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

问题补充:
如何清除getInputStream??请详细说明,谢谢
问题补充:
  Process p = rt.exec("free -m");// 调用系统的命令  
大概循环执行1000次左右,就挂掉了,出现上述错误

原因可能是执行free -m,打开的缓存IO文件过多,如何释放??

已经试过的办法:
} finally {  
    in.close();  
    p.destroy();  
}  
都不起作用,各位大侠分析分析,不胜感谢。
问题补充:
首先,非常感谢lewhwa的热情帮助。

你提供代码和方法我也做过测试,问题依旧,各个流我分别关闭,循环执行1000

次左右还是出现同样的问题。
2009年1月04日 17:48

3个答案 按时间排序 按投票排序

0 0

采纳的答案

多个输入流都没有关闭。用我给代码再试试。

2009年1月05日 19:52
0 0

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @author Hanson
 * 
 */
public class TestDemo {
	public static double[] getMemUsage() throws Exception {

		double[] result = new double[4];

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

		BufferedReader in = null;
		InputStream is=p.getInputStream();
		InputStreamReader isr=new InputStreamReader(p.getInputStream());
		InputStream errIS=p.getErrorStream();
		try {
			in = new BufferedReader(isr);
			String str = null;
			String[] strArray = null;

			while ((str = in.readLine()) != null) {
				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);

						}
					}

				}
			}

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

}

2009年1月05日 19:44
0 0

请参考Java调用外部进程并拦截输入输出流--Java IDE Console解密(上篇)http://www.cnblogs.com/lewhwa/archive/2007/01/14/620395.html
和Java调用外部进程并拦截输入输出流--Java IDE Console解密(下篇)http://www.blogjava.net/lewhwa/archive/2007/01/15/94060.html

引用
大概了解可能是由于打开的句柄过多造成

在Unix或者Linux上标准输入输出以及Stderr,均作为文件方式表示。用的getInputStream有没有清除,所以导致错误。

2009年1月04日 19:00

相关推荐

    process-exporter-0.7.5.linux-amd64.tar.gz

    《process-exporter-0.7.5.linux-amd64.tar.gz:进程监控利器》 在IT领域,系统监控是运维工作中的重要一环,它可以帮助我们及时发现并解决问题,确保服务的稳定运行。"process-exporter-0.7.5.linux-amd64.tar.gz...

    process-exporter-0.7.10.linux-amd64.tar.gzprocess-exporter

    《process-exporter 0.7.10在Linux AMD64平台上的应用详解》 process-exporter是一款开源的监控工具,专为收集和暴露系统进程信息而设计,它能够将这些信息转换为Prometheus可读格式,从而方便进行性能监控和故障...

    java执行可执行文件,Runtime.exec、ProcessBuilder、commons-exec

    本文将详细介绍三种常用的方法:`Runtime.exec()`、`ProcessBuilder`以及`commons-exec`库。 #### 1. 使用`Runtime.exec()` `Runtime.exec()`是最为传统且简单的执行外部程序的方法。它可以启动一个新的进程,并...

    backport-util-concurrent-3.1.jar geronimo-stax-api_1.0_spec-1.0.1.jar 下载

    An error ocCurred while completing process -java.lang.reflect.InvocationTargetException (1).关闭 Eclipse (2).copy %AXIS2_HOME%\lib\ 下的 backport-util-concurrent-3.1.jar 和 geronimo-stax-api_1.0_...

    FFmpeg(liunx中amr转MP3工具)

    Process proc = rt.exec(command); InputStream stderr = proc.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line = ...

    API-MS-WIN一系列丢失DLL打包

    api-ms-win-crt-process-l1-1-0.dll api-ms-win-crt-runtime-l1-1-0.dll api-ms-win-crt-stdio-l1-1-0.dll api-ms-win-crt-string-l1-1-0.dll api-ms-win-crt-time-l1-1-0.dll api-ms-win-crt-utility-l1-1-0.dll ...

    draw.io-13.9.9-windows-installer.exe.zip

    解压即可安装使用,非常好用的画图工具。 diagrams.net is free online diagram software for making flowcharts, process diagrams, org charts, UML, ER and network diagrams

    java中如何调cmd命令

    Process process = runtime.exec(commandStr); ``` 其中,“`cmd /c`”是启动CMD并执行命令,“`cmd /k`”则是启动CMD后执行命令但不关闭窗口。 #### 3. 具体示例 下面通过几个具体的示例来演示如何调用各种CMD...

    spice-0.12.2

    follows the standard process documented in the INSTALL file. As a quick start you can do ./configure --prefix=/usr --sysconfdir=/etc \ --localstatedir=/var --libdir=/usr/lib make sudo make ...

    php-process

    关于低版本PHP资源离线安装包,如果...php-process-5.3.3-50.el6_10.x86_64.rpm php-soap-5.3.3-50.el6_10.x86_64.rpm php-xml-5.3.3-50.el6_10.x86_64.rpm 全部安装完成后如果页面登录不了,需要修改session目录的权限

    Python库 | data_process-0.1.29-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:data_process-0.1.29-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    start-stop-daemon

    -n|--name &lt;process-name&gt; stop processes with this name -s|--signal &lt;signal&gt; signal to send (default TERM) -a|--startas &lt;pathname&gt; program to start (default is ) -N|--nicelevel &lt;incr&gt; add incr to ...

    使用runtime实现linux命令行或shell脚本多次调用

    Process process = runtime.exec("ls -l"); // 读取命令输出 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine...

    process-exporter-0.5.0.linux-amd64.tar.gz

    《process-exporter-0.5.0.linux-amd64.tar.gz:深入了解运维利器——process-exporter》 process-exporter是一款开源的监控工具,专为Linux系统设计,用于收集和暴露进程级别的性能指标,是Prometheus监控生态中的...

    wkhtmltopdf 导出pdf

    Process p = new Process(); string str = System.Web.HttpContext.Current.Server.MapPath("~/wkhtmltopdf.exe"); if (!System.IO.File.Exists(str)) return false; string switches = "--print-media-type ";...

    java智能实现数据库备份.pdf

    Process p = cmd.exec("mysqldump --opt – hlocalhost --user=root --password=admin --lock-all-tables=true --result-file=E://oes//2221.sql --default-character-set=utf8 oes"); ``` 这里需要注意的是,如果...

    ocp-sso:BCGov单点登录密钥

    oc process -f openshift/sso74-x509-postgresql-secrets.yaml -p 'NAME=template.sso' -p 'SUFFIX=' -l part-of=rh-sso,managed-by=template,shared=true | oc create -f -\noc process -f openshift/sso74-x509-...

    java调用windows命令

    Process process = Runtime.getRuntime().exec(".\\p.exe"); ``` - `exec()`方法返回一个Process对象,可以用来控制子进程的执行或获取子进程的信息。 2. **执行DOS内部命令** - 如果要执行DOS内部命令,如`dir...

Global site tag (gtag.js) - Google Analytics