Reputation: 164
I need to check if a non-java process is running (by process name) inside a java program - very similar to the issue in Java - how to check whether another (non-Java) process is running on Linux.
The solution is ok, but it still needs to open a system call process, and I'd like to avoid this.
Is there a pure-java way to get a list of running processes on linux?
Upvotes: 2
Views: 3072
Reputation: 100209
In Java 9 and later there is a standard API to solve this problem called ProcessHandle
.Here's an example:
public class ps {
public static void main(String[] args) {
ProcessHandle.allProcesses()
.map(p -> p.getPid()+": "+p.info().command().orElse("?"))
.forEach(System.out::println);
}
}
It prints the pid and command line (if known) for all processes. Works fine in Windows and Linux.
Upvotes: 4
Reputation: 388
A possible solution might be explorer the proc entries. Indeed, this is how top
and others gain access to the list of running process.
I'm not completely sure if this is what your looking for, but it can give you some clue:
import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class OpenFolder {
public static void main(String[] args) throws IOException {
System.out.println(findProcess("process_name_here"));
}
public static boolean findProcess(String processName) throws IOException {
String filePath = new String("");
File directory = new File("/proc");
File[] contents = directory.listFiles();
boolean found = false;
for (File f : contents) {
if (f.getAbsolutePath().matches("\\/proc\\/\\d+")) {
filePath = f.getAbsolutePath().concat("/status");
if (readFile(filePath, processName))
found = true;
}
}
return found;
}
public static boolean readFile(String filename, String processName)
throws IOException {
FileInputStream fstream = new FileInputStream(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
strLine = br.readLine().split(":")[1].trim();
br.close();
if (strLine.equals(processName))
return true;
else
return false;
}
}
Upvotes: 2
Reputation: 15638
No, there is no pure-java way how to do this. The reason for this probably is, that processes are quite platform-dependent concept. See How to get a list of current open windows/process with Java? (you can find useful tips also for Linux there)
Upvotes: -1