Szukam prostych zadań, takich jak lista wszystkich uruchomionych procesów użytkownika, lub zabić określonego procesu przez pid itp. Podstawowe zarządzanie procesami unix z Java. Czy istnieje biblioteka, która jest stosunkowo dojrzała i udokumentowana? Mogłem uruchomić zewnętrzne polecenie z JVM, a następnie przeanalizować standardowe wyjście/błąd, ale wydaje się, że jest to dużo pracy i wcale nie jest solidne. Jakieś sugestie?Jaki jest najlepszy sposób zarządzania procesem uniksowym z poziomu java?
Odpowiedz
Będziesz musiał przetasować własne rozwiązanie, które myślę. Zabicie procesu zewnętrznego utworzonego przy użyciu interfejsów API Process
można wykonać za pomocą Process.destroy()
. (Należy jednak pamiętać, że destroy()
jak realizowany na Linux/Unix robi „miękkie” zabić, a nie SIGKILL
, więc proces zewnętrzny może być w stanie uniknąć zabity.)
nic poza tym nie jest przenośny.
- Procesy listowania (na komputerze z systemem Linux) można wykonać, odczytując system plików
/proc
. - Inne rzeczy można wykonać, dzwoniąc do natywnego polecenia, używając
Process
. Zależy to od tego, czy twoja funkcja zarządzania wymaga użycia syscalls, które nie są dostępne dla "czystego" programu Java. - Możliwe jest (teoretycznie) użycie JNI i kodu natywnego do przeglądania w natywnych strukturach danych maszyny JVM w celu znalezienia PID poziomu operacyjnego dla procesu i wysłania mu sygnału.
Jeśli przejdziesz na ścieżkę natywnej biblioteki JNI +, strzeż się, że natywne problemy ze wskaźnikami i natywne wątki mogą zabić Twoją maszynę JVM. Może być również konieczne zajęcie się budowaniem i dystrybucją rodzimej biblioteki dla wielu architektur itp. Należy również pamiętać, że wewnętrzne struktury danych mogą być różne dla różnych platform JVM, wydań itp. I że mogą ulec zmianie bez powiadomienia.
Monitor systemu Gnome (wersja systemu Windows Menedżera zadań dla systemu Linux) korzysta z pakietu libgtop2. Dokumnetacja tutaj: http://library.gnome.org/devel/libgtop/stable/
Możesz również sprawdzić źródło Monitora systemu, aby zobaczyć, w jaki sposób korzysta z funkcji libgtop2.
Większość potrzebnych informacji jest dostępna za pośrednictwem systemu plików /proc
, chociaż możesz potrzebować odpowiednich uprawnień, aby przeczytać wszystko. Zwróć uwagę, że zawartość/proc są specyficzne dla Uniksa - np. różni się w Linuksie/Solaris i nie mam pojęcia o tym. Mac OS X.
Jeśli chcesz zabić proces, który sam stworzyłeś, warto przyjrzeć się Process.destroy()
. W przeciwnym razie będziesz musiał wykonać kill
. W tym celu użyć ładnie należy wysłać SIGINT
, a jeśli to nie działa, a następnie wysłać SIGKILL
(do forceably rozwiązać - nie jestem pewien, czy robi to Process.destroy()
)
Oto metoda wysłać SIGKILL do procesu z Java. Używa refleksji, aby uzyskać wartość pid z podklasy Process. Z powodzeniem przetestowany w systemie Mac OS X 1.6 (Snow Leopard) i OpenSuse 11.4, java 1.6, 64-bitowa maszyna wirtualna HotSpot, ale oczywiście brak gwarancji przenośności.
try {
Process p = Runtime.getRuntime().exec("sleep 10000");
Field pidField = p.getClass().getDeclaredField("pid");
pidField.setAccessible(true);
final int pid = pidField.getInt(p);
Process killProcess = Runtime.getRuntime().exec("kill -9 " + pid);
killProcess.waitFor();
System.out.println(p.exitValue());
} catch (Exception e) {
e.printStackTrace();
}
Polecam JavaSysMon: Można listy procesów (PID, PPID, imię i tak dalej), zabijać procesy (procesy potomne włącznie) i monitor komputera. Jeśli chcesz go użyć w projekcie Maven:
<dependency>
<groupId>javasysmon</groupId>
<artifactId>javasysmon</artifactId>
<version>0.3.3</version>
</dependency>
<repository>
<id>javasysmon-repo</id>
<url>http://openr66.free.fr/maven2/</url>
</repository>
- 1. Jaki jest najlepszy sposób modyfikacji konfiguracji projektu z poziomu wtyczki?
- 2. Jaki jest najlepszy sposób zarządzania użytkownikami w ASP.NET MVC
- 3. Jaki jest najlepszy sposób zarządzania drzewem zależności w .NET?
- 4. R z poziomu Java
- 5. Jaki jest najlepszy sposób na interfejs C# i Java?
- 6. Jaki jest najlepszy sposób na iterowanie po liniach ciągu Java?
- 7. Jaki jest najlepszy sposób na wykonanie piaskowanego kodu Java?
- 8. Jaki jest najlepszy sposób prawidłowego przedłużenia wyjątku Java w Scali?
- 9. Jaki jest najlepszy sposób symulacji java.lang.Thread?
- 10. Jaki jest najlepszy sposób na tworzenie Java w Emacs?
- 11. Jaki jest najskuteczniejszy sposób zarządzania dużym zestawem linii w OpenGL?
- 12. Jaki jest właściwy sposób zarządzania dużymi kanałami IStream?
- 13. Jaki jest najlepszy stos Java SIP?
- 14. Jaki jest najlepszy framework serwisowy Java?
- 15. Jaki jest najlepszy sposób inicjowania aktora z bazy danych?
- 16. Jaki jest najlepszy sposób tworzenia wdrożeń ClickOnce
- 17. Jaki jest najlepszy sposób odczytu GetResponseStream()?
- 18. Jaki jest najlepszy sposób testowania usług WCF?
- 19. Jaki jest najlepszy sposób wyszukiwania GitHub?
- 20. W jaki sposób strace łączy się z działającym już procesem?
- 21. Jaki jest najlepszy sposób implementacji protokołów?
- 22. Jaki jest najlepszy sposób na skopiowanie listy?
- 23. Jaki jest najlepszy sposób udokumentowania kodu Perla?
- 24. Jaki jest najlepszy sposób zwiększania wyliczenia?
- 25. Jaki jest najlepszy sposób profilowania wykonywania javascript?
- 26. Jaki jest najlepszy sposób rejestrowania aktywności użytkowników?
- 27. Jaki jest najlepszy sposób na seed srand()?
- 28. Jaki jest najlepszy sposób zarządzania współbieżnością w aplikacji dostępu do bazy danych?
- 29. Jaki jest najlepszy sposób przetestowania aplikacji szyny?
- 30. Jaki jest najlepszy sposób zamknięcia gałęzi Mercurial?
Powodzenia w stabilności JVM, jeśli użyjesz JNI do wywoływania funkcji libgtop2 z Javy :-) –