通过Java应用程序将管道传递给shell命令

问题描述 投票:0回答:1

我需要找出一个特定进程(java.exe)在java webapp中使用了多少内存。

我尝试过以下方法:

Process proc = Runtime.getRuntime().exec("tasklist /v | find \"java.exe\"");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader errInput = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

但是这会返回以下内容:

错误:参数/选项无效 - “|”。 输入“TASKLIST /?”用法。

我知道这是因为管道是一个shell特性,在被传递给shell之前由Java解析。

我也尝试过:

String[] procString = {
    "cmd",
    "/c",
    "tasklist /v | find \"java.exe\""
};
Process proc = Runtime.getRuntime().exec(procString);

但这并没有向BufferedReader返回任何内容。

有没有办法将正确的输出输入到webapp中?

java windows shell
1个回答
0
投票

在exec()函数返回之前,必须定期使用stdInput和errInput流。只要缓冲区已满,exec()函数就会阻塞。也就是说,当没有空间写入缓冲区时,通过exec()函数的命令不会继续。要解决此问题,请在另一个线程中的每个缓冲区已满后读取缓冲区。

对于进入Java程序的人来说,这是一个错误。如果已定义流,则必须使用它(通过读取功能)

© www.soinside.com 2019 - 2024. All rights reserved.