2009-07-28 16 views
5

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

4

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.

1

Możesz spróbować JNA Posix. Jeśli odpowiednie funkcje nie są eksportowane przez tę bibliotekę, bardzo łatwo jest dodać do nich obsługę za pomocą JNA (zrobiłem to dla wielu interfejsów API Win32).

0

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.

+0

Powodzenia w stabilności JVM, jeśli użyjesz JNI do wywoływania funkcji libgtop2 z Javy :-) –

0

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())

1

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(); 
    } 
2

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> 
Powiązane problemy