bash에서 모든 Java 프로세스를 나열하려면 어떻게해야합니까? 명령 줄이 필요합니다. 명령이 있다는 것을 알고 ps
있지만 어떤 매개 변수를 사용해야하는지 모르겠습니다.
ps
먼저 시도 man ps
, info ps
그리고 인터넷에 대해 배운다.
bash에서 모든 Java 프로세스를 나열하려면 어떻게해야합니까? 명령 줄이 필요합니다. 명령이 있다는 것을 알고 ps
있지만 어떤 매개 변수를 사용해야하는지 모르겠습니다.
ps
먼저 시도 man ps
, info ps
그리고 인터넷에 대해 배운다.
답변:
최신 Java는 Java Virtual Machine 프로세스 상태 도구 "jps"와 함께 제공됩니다.
http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
예를 들면
[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
Java 7부터 시작 하여 가장 간단하고 오류 발생 가능성이 적은 jcmd
것은 JDK의 일부인 명령 을 사용하여 모든 OS에서 동일한 방식으로 작동하도록하는 것입니다.
예:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
실행중인 JVM (Java Virtual Machine)에 진단 명령 요청을 보낼 수 있습니다.
사용 방법에jcmd
대한 자세한 내용 .
jps
ps aux | grep java
또는
$ ps -fea|grep -i java
단순히 Java 프로세스를 나열하려면 다음을 사용하십시오.
ps -A | grep java
ps axuwww | grep java | grep -v grep
위는
(btw,이 예제는 효과적인 것은 아니지만 기억하기 쉽습니다);)
위를 다른 명령으로 파이프 할 수 있습니다. 예를 들면 다음과 같습니다.
ps axuwww | grep java | grep -v grep | sed '.....' | while read something
do
something_another $something
done
기타...
특정 Java 클래스가 실행되고 있는지 알고 싶을 때 다음 명령 줄을 사용합니다.
ps ww -f -C java | grep "fully.qualified.name.of.class"
OS 측보기에서 프로세스의 명령 이름은 "java"입니다. "ww"옵션은 열의 최대 문자를 넓히므로 관련 클래스의 FQN을 grep 할 수 있습니다.
$ top
것입니다. 어떤 프로세스가 CPU를 잡아 먹고 있는지 알아 내려고 할 때 그다지 도움이되지 않는 명령으로 "java"를 제공합니다. $ ps ww -fC java
누락 된 퍼즐 조각을 제공합니다.
redhat linux에서 openjdk-1.8을 사용하여 시도했을 때 jps 및 jcmd가 결과를 표시하지 않았습니다. 하지만 그래도 내 경우에는 작동하지 않는 현재 사용자의 프로세스 만 표시합니다. ps | grep을 사용하는 것은 내가 한 일이지만 일부 Java 앱의 클래스 경로가 매우 길어 결과를 읽을 수 없으므로 sed를 사용하여 제거했습니다. 이것은 여전히 약간 거칠지 만 PID, User, java-class / jar, args를 제외한 모든 것을 제거합니다.
ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
결과는 다음과 같습니다.
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
모든 프로세스를 나열하는 창에 대한 대안은 다음과 같습니다.
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
그러나 더 읽기 쉽게 만들려면 파싱이 필요합니다.
이를 수행하는 방법에는 여러 가지가 있습니다. java.lang.ProcessBuilder
및 "pgrep"을 사용 하여 다음과 같은 프로세스 ID (PID)를 얻을 수 있습니다 pgrep -fl java | awk {'print $1'}
. 또는 Linux에서 실행중인 경우 /proc
디렉터리를 쿼리 할 수 있습니다 .
나는 이것이 끔찍하고 이식성이없고 제대로 구현되지 않은 것처럼 보입니다. 동의합니다. 그러나 Java는 실제로 VM에서 실행되기 때문에 JDK를 15 년 이상 작업 한 후에도 실제로 파악할 수없는 어리석은 이유 때문에 JVM 공간 외부에서 사물을 볼 수없는 이유입니다. 정말 우스꽝 스럽습니다. 그것에 대해 생각하십시오. 당신은, 다른 모든 것을 할 수 fork
및 join
자식 프로세스 (그 세계에 대해 알고하지 않은 경우 멀티 태스킹의 끔찍한 방법이었다 스레드 또는 pthreads의 지옥이! 무슨 일이 자바에에 무슨 일이 일어나고 있는지,?! :).
이것은 내가 아는 엄청난 토론을 줄 것이다, 그러나 어쨌든, 나는 이미 내 프로젝트에서 사용하는 아주 좋은 API가 그리고 그것은 안정 충분하다 ( 당신은 여전히 스트레스 테스트에 당신이 전에 정말 API를 신뢰 사용할 때마다 버전이 필요 그래서 OSS있어 ) : HTTPS : //github.com/jezhumble/javasysmon
JavaDoc : http://jezhumble.github.io/javasysmon/ , 클래스 검색 com.jezhumble.javasysmon.OsProcess
, 그녀가 트릭을 수행합니다. 행운을 빕니다.
ps -eaf | grep [j]ava
이 명령을 포함하지 않은 활성 프로세스 만 표시하므로 Java 문자열 []
이있는 트릭 만 표시되므로 더 좋습니다.
나는 이것을 사용한다 (데비안 8에서 좋다) :
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'