Jak uzyskać listę aktualnie otwartych okien / procesów w Javie?

Czy ktos wie jak uzyskac aktualne otwarte okna lub proces lokalnej maszyny uzywajacej Javy?

To, co próbuję zrobić, to: wypisać bieżące otwarte zadanie, windows lub proces otwarty, jak w Windows Taskmanager, ale używając podejścia wieloplatformowego-używając tylko Javy, jeśli jest to możliwe.

Author: Tshepang, 2008-09-10

11 answers

Jest to kolejne podejście do analizy listy procesów z polecenia " 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();
}

Jeżeli używasz Windows, wtedy należy zmienić linię: "Process p = Runtime.getRun..."itd... (3rd line), dla takiego, który wygląda tak:

Process p = Runtime.getRuntime().exec
    (System.getenv("windir") +"\\system32\\"+"tasklist.exe");

Mam nadzieję, że info pomoże!

 89
Author: ramayac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 01:46:47

W systemie Windows istnieje alternatywa używając 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);
    }
}
 23
Author: Emmanuel Bourg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 09:53:35

Wreszcie, z Java 9 jest to możliwe z 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("-");
}

Edit: "will be" → " is "

 14
Author: Hugues M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 01:09:40

Jedynym sposobem na zrobienie tego jest wywołanie aplikacji wiersza poleceń, która wykonuje zadanie za Ciebie, a następnie screenscraping wyjście (jak ps Linuksa i lista zadań Window).

Niestety, oznacza to, że będziesz musiał napisać kilka procedur parsowania, aby odczytać dane z obu.

Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
    // TODO scan the procOutput for your data
}
 9
Author: jodonnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-10 18:51:44

YAJSW (Yet Another Java Service Wrapper) wygląda na to, że ma implementacje swojego org oparte na JNA.rzo.yajsw.os.TaskList interfejs dla win32, linux, BSD i solaris i jest na licencji LGPL. Nie próbowałem wywoływać tego kodu bezpośrednio, ale YAJSW działa naprawdę dobrze, gdy używałem go w przeszłości, więc nie powinieneś mieć zbyt wielu zmartwień.

 7
Author: SamWest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 21:40:45

Możesz łatwo pobrać listę uruchomionych procesów za pomocą 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("------------------");
}
 5
Author: profesor_falken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 17:12:59

Nie ma na to neutralnego dla platformy sposobu. W wersji 1.6 Javy dodano klasę "Desktop " pozwalającą na przenośne sposoby przeglądania, edycji, wysyłania, otwierania i drukowania URI. możliwe, że klasa ta zostanie kiedyś rozszerzona o obsługę procesów, ale wątpię w to.

Jeśli interesują Cię tylko procesy Java, możesz użyć java.lang.Zarządzanie api do uzyskiwania informacji o wątku / pamięci w JVM.

 4
Author: hazzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-10 18:48:46

Dla windows używam następujących:

        Process process = new ProcessBuilder("tasklist.exe", "/fo", "csv", "/nh").start();
    new Thread(() -> {
        Scanner sc = new Scanner(process.getInputStream());
        if (sc.hasNextLine()) sc.nextLine();
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] parts = line.split(",");
            String unq = parts[0].substring(1).replaceFirst(".$", "");
            String pid = parts[1].substring(1).replaceFirst(".$", "");
            System.out.println(unq + " " + pid);
        }
    }).start();
    process.waitFor();
    System.out.println("Done");
 4
Author: Stepan Yakovenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 12:44:39

Używanie kodu do analizy ps aux dla Linuksa i tasklist Dla windows To najlepsze opcje, dopóki nie pojawi się coś bardziej ogólnego.

Dla windows, można odwołać: http://www.rgagnon.com/javadetails/java-0593.html

Linux może również przesyłać wyniki ps aux przez grep, co sprawi, że przetwarzanie/wyszukiwanie będzie szybkie i łatwe. Na pewno znajdziesz coś podobnego również dla windows.

 3
Author: James Oravec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 16:46:48

Może to być przydatne dla aplikacji z pakietem JRE: skanuję w poszukiwaniu nazwy folderu, z którego uruchamiam aplikację: więc jeśli aplikacja jest wykonywana z:

 C:\Dev\build\SomeJavaApp\jre-9.0.1\bin\javaw.exe

Następnie możesz znaleźć, czy działa już w J9, przez:

   public static void main(String[] args)
   {
    AtomicBoolean isRunning = new AtomicBoolean(false);
    ProcessHandle.allProcesses()
            .filter(ph -> ph.info().command().isPresent() && ph.info().command().get().contains("SomeJavaApp"))
            .forEach((process) -> {
                isRunning.set(true);
            });

    if (isRunning.get()) System.out.println("SomeJavaApp is running already");
   }
 1
Author: wax_lyrical,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 10:32:46
package com.vipul;

import java.applet.Applet;
import java.awt.Checkbox;
import java.awt.Choice;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class BatchExecuteService extends Applet {
    public Choice choice;

    public void init() 
    {
        setFont(new Font("Helvetica", Font.BOLD, 36));
        choice = new Choice();
    }

    public static void main(String[] args) {
        BatchExecuteService batchExecuteService = new BatchExecuteService();
        batchExecuteService.run();
    }

    List<String> processList = new ArrayList<String>();

    public void run() {
        try {
            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec("D:\\server.bat");
            process.getOutputStream().close();
            InputStream inputStream = process.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(
                    inputStream);
            BufferedReader bufferedrReader = new BufferedReader(
                    inputstreamreader);
            BufferedReader bufferedrReader1 = new BufferedReader(
                    inputstreamreader);

            String strLine = "";
            String x[]=new String[100];
            int i=0;
            int t=0;
            while ((strLine = bufferedrReader.readLine()) != null) 
            {
        //      System.out.println(strLine);
                String[] a=strLine.split(",");
                x[i++]=a[0];
            }
    //      System.out.println("Length : "+i);

            for(int j=2;j<i;j++)
            {
                System.out.println(x[j]);
            }
        }
        catch (IOException ioException) 
        {
            ioException.printStackTrace();
        }

    }
}
   You can create batch file like 

TASKLIST / V / FI "STATUS EQ running" / FO " CSV "/ FI "Username eq LHPL002\soft" /FI "MEMUSAGE gt 10000"/FI "Windowtitle ne N /A" / NH

 0
Author: Panchotiya Vipul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 05:22:34