Jak wyświetlić listę wszystkich procesów Java w bash? Potrzebuję linii poleceń. Wiem, że jest polecenie, ps
ale nie wiem, jakich parametrów potrzebuję.
ps
to najpierw spróbować man ps
, info ps
i dowiedzieć się o nim w Internecie.
Jak wyświetlić listę wszystkich procesów Java w bash? Potrzebuję linii poleceń. Wiem, że jest polecenie, ps
ale nie wiem, jakich parametrów potrzebuję.
ps
to najpierw spróbować man ps
, info ps
i dowiedzieć się o nim w Internecie.
Odpowiedzi:
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
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
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
.
jps
Aby uzyskać lepszy format wyjściowy, sprawdź to polecenie:
ps -fC java
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
ps aux | grep java
lub
$ ps -fea|grep -i java
Jeśli chcę po prostu wymienić procesy java, użyj:
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
procesu?
ps axuwww | grep java | grep -v grep
Powyższe będzie
(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...
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.
$ top
po prostu podaję "java" jako polecenie, które nie jest zbyt pomocne, gdy próbuję dowiedzieć się, który proces zajmuje procesor. $ ps ww -fC java
zawiera brakujące elementy układanki.
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ą.
Jest na to wiele sposobów. Można użyć java.lang.ProcessBuilder
i „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 /proc
katalog.
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 fork
i join
procesy 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.
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ę
Używam tego (dobrze na Debianie 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
Aby poznać listę programów Java działających na komputerze z systemem Linux. ps -e | grep java