Wie bekomme ich eine Liste der aktuell geöffneten Fenster/Prozesse mit Java?
Lesezeit: 5 Minuten
Rodrigo Amaya
Weiß jemand, wie ich die aktuellen offenen Fenster oder den Prozess einer lokalen Maschine mit Java erhalte?
Was ich versuche, ist: Listen Sie die aktuell geöffnete Aufgabe, die geöffneten Fenster oder Prozesse auf, wie im Windows Taskmanager, aber mit einem plattformübergreifenden Ansatz – wenn möglich nur mit Java.
Rodrigo Amaya
Dies ist ein weiterer Ansatz, um die Prozessliste aus dem Befehl „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();
}
Wenn Sie Windows verwenden, sollten Sie die Zeile: “Process p = Runtime.getRun …” etc … (3. Zeile) ändern, für eine, die so aussieht:
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
Hoffe die Info hilft!
So erhalten Sie die Start- und Endzeit des Prozesses
– Dollar
11. September 2012 um 9:27 Uhr
Führen Sie unter Windows aus tasklist.exe /fo csv /nh Um die Liste im CSV-Format zu erhalten, ist das viel einfacher zu analysieren.
– Emmanuel Burg
24. Januar 2013 um 15:31 Uhr
aber es zeigt nicht den jar-namen. Der Name meiner ausführbaren JAR lautet helloDemo.jar. aber es zeigt nichts dafür
– Beschwöre Bappi
2. Mai 2015 um 10:57 Uhr
Warum würde es nicht funktionieren, wenn ich ein | hinzufüge grep java ? dh ps -elf | grep java wird nichts zurückgeben, aber ps -elf würde wie erwartet funktionieren.
– Itay Moav-Malimovka
2. Mai 2016 um 20:28 Uhr
Es sollte beachtet werden, dass das “Windows-spezifische” Bit am unteren Rand unnötig zu sein scheint. Unter Windows 10, (.exec (Runtime/getRuntime) "tasklist")) (in Clojure unter Verwendung von Java-Interop) gibt die korrekt zurück tasklist verarbeiten, auch ohne Angabe eines Verzeichnisses.
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);
}
}
Dadurch wird nur der Befehlsname angegeben, NICHT die gesamte Befehlszeile. Gibt es eine Möglichkeit, die gesamte Befehlszeile zu erhalten?
– Christoph Dancy
4. Mai 2013 um 19:31 Uhr
Den vollständigen Pfad erhalten Sie telefonisch GetModuleFileName. Ein Beispiel finden Sie unter stackoverflow.com/questions/7521693/….
– Emmanuel Burg
6. Mai 2013 um 8:29 Uhr
Das einzige Problem dabei ist, dass es nur den Pfad des Prozesses angibt, NICHT die gesamte Befehlszeile. Gibt es eine Möglichkeit, die vollständige Befehlszeile des Prozesses abzurufen (z. B. ‘ant.bat -f helloWorld.ext’)?
– Christoph Dancy
6. Mai 2013 um 16:31 Uhr
Wie kann man überprüfen, ob ein bestimmter Prozess wie xyz.exe ausgeführt wird oder nicht?
– unbekannte Bits
5. Juli 2013 um 6:31 Uhr
@ChristopherDancy nicht sicher, ob Sie noch eine Antwort benötigen, aber der Vollständigkeit halber und da es hier auch nicht erwähnt wurde: Winodws-Verwaltungsinformationen Befehlszeile (oder einfach wmic.exe) bietet eine Möglichkeit, viele Informationen über laufende Anwendungen abzurufen – WMIC PROCESS oder um die Ausgabe für einen bestimmten Prozess einzuschränken: WMIC PROCESS WHERE name='theName'. Sie können weitere Filter verwenden, um die Ausgabe bei Bedarf einzuschränken. Die Kommandozeile ist in der CommandLine-Spalte der zurückgegebenen Tabelle enthalten (= 2. Spalte)
– Roman Vottner
13. Januar 2014 um 13:51 Uhr
jodonnell
Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, eine Befehlszeilenanwendung aufzurufen, die die Arbeit für Sie erledigt, und dann die Ausgabe zu scannen (wie Linux ps und Windows Tasklist).
Leider bedeutet das, dass Sie einige Parsing-Routinen schreiben müssen, um die Daten von beiden zu lesen.
Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
// TODO scan the procOutput for your data
}
JAJSW (Yet Another Java Service Wrapper) scheint JNA-basierte Implementierungen seiner org.rzo.yajsw.os.TaskList-Schnittstelle für win32, linux, bsd und solaris zu haben und steht unter einer LGPL-Lizenz. Ich habe nicht versucht, diesen Code direkt aufzurufen, aber YAJSW funktioniert wirklich gut, wenn ich es in der Vergangenheit verwendet habe, also sollten Sie sich nicht allzu viele Sorgen machen.
anscheinend ist v12+ eine Apache/LGPL-Doppellizenz
– Harschware
25. Februar 2015 um 0:18 Uhr
Irwin Nawrocki
Sie können die Liste der laufenden Prozesse einfach mit abrufen jProzesse
anscheinend ist v12+ eine Apache/LGPL-Doppellizenz
– Harschware
25. Februar 2015 um 0:18 Uhr
hazz
Dafür gibt es keine plattformneutrale Möglichkeit. In der Version 1.6 von Java ist ein “Schreibtisch” Klasse wurde hinzugefügt, die portable Möglichkeiten zum Durchsuchen, Bearbeiten, Versenden, Öffnen und Drucken von URIs ermöglicht. Es ist möglich, dass diese Klasse eines Tages erweitert wird, um Prozesse zu unterstützen, aber ich bezweifle es.
Wenn Sie nur an Java-Prozessen interessiert sind, können Sie die verwenden java.lang.management api zum Abrufen von Thread-/Speicherinformationen auf der JVM.
9281000cookie-checkWie bekomme ich eine Liste der aktuell geöffneten Fenster/Prozesse mit Java?yes