I have this command:
new ProcessBuilder()
.command("watch", "-n2", "ps", "-q", IdeProcess.pid, "-o", "rss");
How I can to parse output from this command?
When I get InputStream of this Process, I get an empty line every time.
—
I used to restart the command via Java, creating a new thread and all over again. Now, I decided to implement it with the help of watch.
Snippet of code:
var process = processBuilder.start();
var stream = process.getInputStream();
var input = new StringBuilder();
int n;
//while (isOpenIO) {
while ((n = stream.read()) != -1)
input.append((char) n);
if (input.length() > 0)
System.out.println("NON EMPTY");
if (input.length() > 3) {
String text = input.substring(input.indexOf("n") + 1, input.length() - 1);
String modified = text.replaceAll("\B(?=(\d{3})+(?!\d))", ",");
System.out.println("RAM: " + modified + " Mb"));
}
//}
Advertisement
Answer
A very crude example of something like what you want to achieve is the following. This uses a single threaded executor service running at 2 seconds intervals, polling the memory usage of a given process.
At the moment this only prints the result out to the console, but you can tinker around with it to return a Future so you can get your result.
I hope this helps.
private static ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
public static void main(String[] args) {
scheduledExecutorService.scheduleAtFixedRate(() -> {
try {
Process process = new ProcessBuilder("ps", "-p", "2782", "-o", "%mem").redirectErrorStream(true).start();
try(BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String s = reader.lines().collect(Collectors.joining("n"));
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}, 0, 2, TimeUnit.SECONDS);
}
For reference, I’m using ps here to get the memory usage of the process in question, but you can use whatever you like.