Lista procesów Java


113

Jak wyświetlić listę wszystkich procesów Java w bash? Potrzebuję linii poleceń. Wiem, że jest polecenie, psale nie wiem, jakich parametrów potrzebuję.


1
proszę wykazać się nieco większym wysiłkiem w zbadaniu tego i opisaniu problemu, istnieje wiele możliwości w zależności od tego, czego dokładnie szukasz.
Mat

3
Jeśli wiesz, że nie jest psto najpierw spróbować man ps, info psi dowiedzieć się o nim w Internecie.
ssapkota

Odpowiedzi:


148

próbować:

ps aux | grep java

i zobacz, jak sobie radzisz


109

Najnowsza wersja Java jest dostarczana z narzędziem Java Virtual Machine Process Status Tool „jps”

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

Na przykład,

[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m

2
Uwaga: jps jest dostarczany tylko z JDK, a nie JRE. Maszyny ze zwykłymi, starymi środowiskami wykonawczymi Java nie będą miały tego narzędzia.
aguazales

jak mogę uzyskać tylko liczbę uruchomionych procesów java?
Jet

50
jps -lV

jest najbardziej przydatna. Wyświetla tylko pid i kwalifikowaną nazwę klasy głównej:

2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer

31

Możesz również użyć pojedynczego polecenia pgrep (nie wymaga używania potoków i wielu poleceń):

pgrep -fl java

27

Począwszy od Java 7 , najprostszym sposobem i mniej podatnym na błędy jest po prostu użycie polecenia, jcmd które jest częścią JDK, tak aby działało w ten sam sposób we wszystkich systemach operacyjnych.

Przykład:

> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram

jcmd umożliwia wysyłanie poleceń diagnostycznych do działającej wirtualnej maszyny języka Java (JVM).

Więcej szczegółów o tym, jak używaćjcmd .

Zobacz także Utilityjcmd


1
Wow, to nawet lepsze niżjps
Sridhar Sarnobat


12

Spowoduje to zwrócenie wszystkich uruchomionych procesów java w środowisku linux. Następnie możesz zabić proces, używając identyfikatora procesu.

ps -e|grep java



5
pgrep -l java
ps -ef | grep java

5
Dziękujemy za ten fragment kodu, który może zapewnić natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego wartość edukacyjną, pokazując, dlaczego jest to dobre rozwiązanie problemu, i uczyniłoby je bardziej użytecznym dla przyszłych czytelników z podobnymi, ale nie identycznymi pytaniami. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia. W szczególności, dlaczego druga z nich nie pokazuje grepprocesu?
Toby Speight

4
ps axuwww | grep java | grep -v grep

Powyższe będzie

  • pokaż wszystkie procesy z długimi liniami (argument: www)
  • filter (grep) tylko wiersze zawierające słowo java i
  • odfiltruj wiersz „grep java” :)

(przy okazji, ten przykład nie jest skuteczny, ale łatwy do zapamiętania);)

możesz przesłać powyższe do innych poleceń, na przykład:

ps axuwww | grep java | grep -v grep | sed '.....'  | while read something
do
    something_another $something
done

itp...


3

Kiedy chcę wiedzieć, czy wykonywana jest określona klasa Java, używam następującego wiersza poleceń:

ps ww -f -C java | grep "fully.qualified.name.of.class"

W widoku strony systemu operacyjnego nazwa polecenia procesu to „java”. Opcja „ww” poszerza maksymalną liczbę znaków w kolumnie, więc możliwe jest grepowanie FQN powiązanej klasy.


To jest to, czego szukałem - $ toppo prostu podaję "java" jako polecenie, które nie jest zbyt pomocne, gdy próbuję dowiedzieć się, który proces zajmuje procesor. $ ps ww -fC javazawiera brakujące elementy układanki.
David Clarke,

2

jps i jcmd nie pokazywały mi żadnych wyników, gdy próbowałem go używać przy użyciu openjdk-1.8 na redhat linux. Ale nawet jeśli tak, to pokazuje tylko procesy w ramach bieżącego użytkownika, co w moim przypadku nie działa. Użycie ps | grep jest tym, co ostatecznie zrobiłem, ale ścieżka klas dla niektórych aplikacji Java może być bardzo długa, co sprawia, że ​​wyniki są nieczytelne, więc użyłem seda, aby ją usunąć. Jest to jeszcze trochę szorstkie, ale usuwa wszystko oprócz: PID, użytkownika, java-class / jar, args.

ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'

Wyniki wyglądają mniej więcej tak:

  PID USER     CMD
11251 userb org.apache.zookeeper.server.quorum.QuorumPeerMain ../config/zookeeper.properties
19574 userb com.intellij.idea.Main
28807 root org.apache.nifi.bootstrap.RunNiFi run
28829 root org.apache.nifi.NiFi

Alternatywą w systemie Windows do wyświetlania wszystkich procesów jest:

WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline

Ale to będzie wymagało trochę analizy, aby uczynić ją bardziej czytelną.


1

Jest na to wiele sposobów. Można użyć java.lang.ProcessBuilderi „pgrep”, aby uzyskać identyfikator procesu (PID) z czymś takim: pgrep -fl java | awk {'print $1'}. Lub, jeśli pracujesz w systemie Linux, możesz zapytać o /prockatalog.

Wiem, to wydaje się okropne i nieprzenośne, a nawet źle wdrożone, zgadzam się. Ale ponieważ Java faktycznie działa na maszynie wirtualnej, z jakiegoś absurdalnego powodu, którego nie mogę zrozumieć po ponad 15 latach pracy z JDK, dlatego nie można zobaczyć rzeczy poza przestrzenią JVM, to naprawdę śmieszne z tobą Pomyśl o tym. Można robić wszystko inne, nawet forki joinprocesy potomne (te były straszne sposób wielozadaniowość, kiedy świat nie wiedział o wątków lub pthreads , co to do cholery! Co się dzieje w sprawie Java ?! :).

To da ogromną dyskusję, którą znam, ale w każdym razie istnieje bardzo dobre API, którego już używałem w moich projektach i jest wystarczająco stabilne ( to OSS, więc nadal musisz przetestować każdą wersję, której używasz, zanim naprawdę zaufasz API ): https : //github.com/jezhumble/javasysmon

JavaDoc: http://jezhumble.github.io/javasysmon/ , wyszukaj klasę com.jezhumble.javasysmon.OsProcess, ona załatwi sprawę . Mam nadzieję, że to pomogło, powodzenia.


1
 ps -eaf | grep [j]ava

Jest lepiej, ponieważ pokaże tylko aktywne procesy, nie uwzględniając tego polecenia, które również otrzymało ciąg java, []który załatwia sprawę


powinno być ps -af | grep Java not [j] ava
vaquar khan

@vaquarkhan koleś po prostu spróbuj uruchomić obie sugestie i moje i zobacz, jaka jest różnica, oba będą działać
Ilya Gazman

Oba dają te same wyniki, jednak [j] ava jest myląca
vaquar khan

0

Używam tego (dobrze na Debianie 8): alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'


-1

Aby poznać listę programów Java działających na komputerze z systemem Linux. ps -e | grep java

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.