Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Как следить за процессами в реальном времени с помощью Java?

#java #windows


Как в Java следить за процессами Windows в реальном времени?

Программа должна следить за процессами в фоне, и как только запускается нужный процесс
выполнять определенное действие, затем ждать завершение данного процесса. По завершению
выполнять определенные действия и снова следить за его запуском.

Вот что есть:

try {
    String line;
    Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\"
+ "tasklist.exe");
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((line = input.readLine()) != null) {
        // Здесь идет обработка всех процессов
    }
    input.close();
} catch (Exception err) {
    err.printStackTrace();
}


В цикле обновлять Process p мне кажется неправильно, возможно существует другой способ
слежения за процессами?
    


Ответы

Ответ 1



Нормальный способ мониторить системные процессы появится только в Java-9 (смотрите JEP-102). Тогда появится счастье, можно будет писать в духе if(ProcessHandle.allProcesses().anyMatch(info -> info.command() .filter(str -> str.contains("myProcessName")).isPresent())) { // Нужный процесс запущен } Сейчас, увы, нужны всякие костыли. Есть вариант для винды — использовать 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); } } Мне такой вариант кажется более надёжным, чем периодический запуск tasklist.exe.

Комментариев нет:

Отправить комментарий