To jest inny sposób parsowania 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);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
Jeśli korzystasz z systemu Windows, powinieneś zmienić wiersz: „Process p = Runtime.getRun ...” etc ... (3rd line), na taki, który wygląda tak:
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
Mam nadzieję, że te informacje pomogą!
tasklist.exe /fo csv /nh
aby uzyskać listę w formacie CSV, co jest znacznie łatwiejsze do przeanalizowania.ps -elf | grep java
nie zwróci niczego, aleps -elf
będzie działać zgodnie z oczekiwaniami.(.exec (Runtime/getRuntime) "tasklist"))
(w Clojure, przy użyciu Java-Interop) poprawnie zwracatasklist
proces, nawet bez określania katalogu.Wreszcie z Javą 9+ jest to możliwe dzięki
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("-"); }
Wynik:
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
źródło
java.lang
więc nie ma potrzeby importowaniaW systemie Windows istnieje alternatywa korzystania z 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); } }
źródło
GetModuleFileName
. Przykład można znaleźć na stackoverflow.com/questions/7521693/… .WMIC PROCESS
lub ograniczyć wyjściowe dla procesu parametry:WMIC PROCESS WHERE name='theName'
. W razie potrzeby możesz użyć dalszych filtrów, aby ograniczyć wyjście. Wiersz poleceń znajduje się w kolumnie CommandLine w zwróconej tabeli (= druga kolumna)Jedynym sposobem, w jaki mogę to zrobić, jest wywołanie aplikacji wiersza poleceń, która wykonuje zadanie za Ciebie, a następnie zeskanowanie danych wyjściowych (jak ps Linux i lista zadań Windows).
Niestety, będzie to oznaczać, że będziesz musiał napisać kilka procedur parsujących, 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 }
źródło
tasklist
program można skonfigurować tak, aby wyświetlał CSV :)YAJSW (Yet Another Java Service Wrapper) wygląda tak, jakby miał oparte na JNA implementacje swojego interfejsu org.rzo.yajsw.os.TaskList 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ń.
źródło
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("------------------"); }
źródło
Nie ma na to sposobu neutralnego dla platformy. W wersji 1.6 języka Java dodano klasę „ Desktop ”, która umożliwia przenośne sposoby przeglądania, edycji, wysyłania pocztą, otwierania i drukowania identyfikatorów URI. Jest możliwe, że kiedyś ta klasa zostanie rozszerzona o obsługę procesów, ale wątpię w to.
Jeśli interesują Cię tylko procesy w języku Java, możesz użyć interfejsu API java.lang.management, aby uzyskać informacje o wątkach / pamięci w JVM.
źródło
W przypadku okien 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");
źródło
Może to być przydatne w przypadku aplikacji z dołączonym środowiskiem JRE: szukam 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
możesz sprawdzić, czy działa już w J9, wykonując:
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"); }
źródło
Używanie kodu do analizowania
ps aux
dla systemu Linux itasklist
dla systemu Windows to najlepsze opcje, dopóki nie pojawi się coś bardziej ogólnego.W przypadku systemu Windows możesz odwołać się do: http://www.rgagnon.com/javadetails/java-0593.html
Linux może rura wyniki
ps aux
poprzezgrep
zbyt, które sprawiają, przetwarzanie / wyszukiwanie szybkie i łatwe. Jestem pewien, że możesz znaleźć coś podobnego do okien.źródło
Poniższy program będzie kompatybilny tylko z wersją Java 9+ ...
Aby uzyskać informacje o CurrentProcess,
public class CurrentProcess { public static void main(String[] args) { ProcessHandle handle = ProcessHandle.current(); System.out.println("Current Running Process Id: "+handle.pid()); ProcessHandle.Info info = handle.info(); System.out.println("ProcessHandle.Info : "+info); } }
Dla wszystkich uruchomionych procesów
import java.util.List; import java.util.stream.Collectors; public class AllProcesses { public static void main(String[] args) { ProcessHandle.allProcesses().forEach(processHandle -> { System.out.println(processHandle.pid()+" "+processHandle.info()); }); } }
źródło
String line; Process process = Runtime.getRuntime().exec("ps -e"); process.getOutputStream().close(); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = input.readLine()) != null) { System.out.println(line); //<-- Parse data here. } input.close();
Musimy użyć, w
process.getOutputStream.close()
przeciwnym razie zostanie zablokowana pętla while.źródło
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(); } } }
źródło
To jest mój kod funkcji, która pobiera zadania i pobiera ich nazwy, a także dodaje je do listy, aby uzyskać dostęp z listy. Tworzy pliki tymczasowe z danymi, odczytuje pliki i pobiera nazwę zadania z przyrostkiem .exe i ustawia pliki do usunięcia po zakończeniu programu za pomocą System.exit (0), ukrywa również procesy, które są używane do pobierz zadania, a także java.exe, aby użytkownik nie mógł przypadkowo zabić procesu, który uruchamia program razem.
private static final DefaultListModel tasks = new DefaultListModel(); public static void getTasks() { new Thread() { @Override public void run() { try { File batchFile = File.createTempFile("batchFile", ".bat"); File logFile = File.createTempFile("log", ".txt"); String logFilePath = logFile.getAbsolutePath(); try (PrintWriter fileCreator = new PrintWriter(batchFile)) { String[] linesToPrint = {"@echo off", "tasklist.exe >>" + logFilePath, "exit"}; for(String string:linesToPrint) { fileCreator.println(string); } fileCreator.close(); } int task = Runtime.getRuntime().exec(batchFile.getAbsolutePath()).waitFor(); if(task == 0) { FileReader fileOpener = new FileReader(logFile); try (BufferedReader reader = new BufferedReader(fileOpener)) { String line; while(true) { line = reader.readLine(); if(line != null) { if(line.endsWith("K")) { if(line.contains(".exe")) { int index = line.lastIndexOf(".exe", line.length()); String taskName = line.substring(0, index + 4); if(! taskName.equals("tasklist.exe") && ! taskName.equals("cmd.exe") && ! taskName.equals("java.exe")) { tasks.addElement(taskName); } } } } else { reader.close(); break; } } } } batchFile.deleteOnExit(); logFile.deleteOnExit(); } catch (FileNotFoundException ex) { Logger.getLogger(Functions.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException | InterruptedException ex) { Logger.getLogger(Functions.class.getName()).log(Level.SEVERE, null, ex); } catch (NullPointerException ex) { // This stops errors from being thrown on an empty line } } }.start(); } public static void killTask(String taskName) { new Thread() { @Override public void run() { try { Runtime.getRuntime().exec("taskkill.exe /IM " + taskName); } catch (IOException ex) { Logger.getLogger(Functions.class.getName()).log(Level.SEVERE, null, ex); } } }.start(); }
źródło