Java를 사용하여 현재 열려있는 창이나 로컬 시스템의 프로세스를 얻는 방법을 아는 사람이 있습니까?
내가하려는 것은 Windows Taskmanager에서와 같이 현재 열려있는 작업, 창 또는 열려있는 프로세스를 나열하지만 가능한 경우 Java 만 사용하는 다중 플랫폼 접근 방식을 사용하는 것입니다.
답변
이것은 ” ps -e ” 명령에서 프로세스 목록을 구문 분석하는 또 다른 방법입니다 .
try {
String line;
Process p = Runtime.getRuntime().exec("ps -e");
BufferedReader input =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line); //<-- Parse data here.
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
Windows를 사용하는 경우 “Process p = Runtime.getRun …”등 … (세 번째 줄) 줄을 다음과 같이 변경해야합니다.
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
정보가 도움이되기를 바랍니다.
답변
마지막으로 Java 9 이상에서는 ProcessHandle
다음 과 같이 가능합니다 .
public static void main(String[] args) {
ProcessHandle.allProcesses()
.forEach(process -> System.out.println(processDetails(process)));
}
private static String processDetails(ProcessHandle process) {
return String.format("%8d %8s %10s %26s %-40s",
process.pid(),
text(process.parent().map(ProcessHandle::pid)),
text(process.info().user()),
text(process.info().startInstant()),
text(process.info().commandLine()));
}
private static String text(Optional<?> optional) {
return optional.map(Object::toString).orElse("-");
}
산출:
1 - root 2017-11-19T18:01:13.100Z /sbin/init
...
639 1325 www-data 2018-12-04T06:35:58.680Z /usr/sbin/apache2 -k start
...
23082 11054 huguesm 2018-12-04T10:24:22.100Z /.../java ProcessListDemo
답변
Windows에는 JNA를 사용하는 대안이 있습니다 .
import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.win32.W32APIOptions;
public class ProcessList {
public static void main(String[] args) {
WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE_OPTIONS);
WinNT.HANDLE snapshot = winNT.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();
while (winNT.Process32Next(snapshot, processEntry)) {
System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));
}
winNT.CloseHandle(snapshot);
}
}
답변
내가 생각할 수있는 유일한 방법은 작업을 수행하는 명령 줄 응용 프로그램을 호출 한 다음 출력을 스크랩하는 것입니다 (예 : Linux의 ps 및 Window의 작업 목록).
불행히도 두 가지 모두에서 데이터를 읽으려면 파싱 루틴을 작성해야합니다.
Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
// TODO scan the procOutput for your data
}
답변
YAJSW (Yet Another Java Service Wrapper)는 win32, linux, bsd 및 solaris 용 org.rzo.yajsw.os.TaskList 인터페이스의 JNA 기반 구현을 포함하고 있으며 LGPL 라이선스를 따릅니다. 이 코드를 직접 호출 해본 적은 없지만 YAJSW는 예전에 사용해봤을 때 정말 잘 작동하기 때문에 걱정할 필요가 없습니다.
답변
jProcesses를 사용하여 실행중인 프로세스 목록을 쉽게 검색 할 수 있습니다.
List<ProcessInfo> processesList = JProcesses.getProcessList();
for (final ProcessInfo processInfo : processesList) {
System.out.println("Process PID: " + processInfo.getPid());
System.out.println("Process Name: " + processInfo.getName());
System.out.println("Process Used Time: " + processInfo.getTime());
System.out.println("Full command: " + processInfo.getCommand());
System.out.println("------------------");
}
답변
이를 수행하는 플랫폼 중립적 인 방법은 없습니다. Java 1.6 릴리스에서 ” 데스크탑 “클래스가 추가되어 URI를 검색, 편집, 메일 링, 열기 및 인쇄 할 수있는 이식 가능한 방법이 있습니다. 이 수업은 언젠가 프로세스를 지원하기 위해 확장 될 수 있지만 의심 스럽습니다.
Java 프로세스에만 관심이있는 경우 java.lang.management api를 사용 하여 JVM에 대한 스레드 / 메모리 정보 를 가져올 수 있습니다 .