簡體   English   中英

通過Java應用程序將管道傳遞到Shell命令

[英]Passing pipes into shell commands via Java application

我需要找出某個進程(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中?

在exec()函數返回之前,必須定期使用stdInput和errInput流。 每當緩沖區已滿時,exec()函數都會阻塞。 也就是說,當沒有空間可寫入緩沖區時,通過exec()函數執行的命令不會繼續執行。 要解決此問題,請在另一個線程中的每個緩沖區已滿后讀取緩沖區。

對於進入Java程序的人來說,這是一個容易犯的錯誤。 如果已定義流,則必須使用它(通過read函數)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM