서버에서는 많은 Java 프로세스가 실행되고 있습니다. 일반적으로 ps -ef | 명령을 사용하여 Java 프로세스의 PID를 캡처합니다. grep java'. 일반적으로 Java 프로세스의 구조에는 아래와 같이 많은 jar가 있습니다.
java -DCORDYS_INSTALL_DIR=/opt/abcd/clouprod01 \
-cp "/opt/abcd/clouprod01/scp.jar:/opt/abcd/clouprod01/scp.jar:/usr/lib/mysql-connector-java-5.1.22-bin.jar::/usr/lib/mysql-connector-java-5.1.22-bin.jar: com.eibus.tools.admin.cmc" \
-DProcessName=ABCD
위의 Java 프로세스에는 "-DProcessName=ABCD"와 같이 Java 프로세스에 매개변수로 전달되는 일부 매개변수가 있습니다.
내 경우에는 일부 Java 프로세스의 경우 Java 프로세스가 시작될 때 거의 50개의 jar 파일이 로드됩니다. 따라서 ps 명령의 결과는 Java 프로세스의 전체 구조/스택을 표시하지 않습니다. 결과는 다음과 같습니다
java -DCORDYS_INSTALL_DIR=/opt/abcd/clouprod01 -cp "/opt/abcd/clouprod01/scp.jar:/opt/abcd/clouprod01/scp.jar:
ps
이 명령이나 다른 명령을 사용하여 Java 프로세스의 전체 구조/스택을 추적하는 데 도움을 줄 수 있는 사람이 있습니까?
답변1
RHEL/CentOS bash 셸에서 이는 일반적으로 ps가 출력을 자른 결과입니다. 이 경우 ps 옵션에 두 개의 "w"를 추가하여 전체 명령줄을 얻을 수 있습니다.
ps -efww | grep java
'w' 옵션을 완료할 수 없거나 사용할 수 없는 경우 ps 바이너리에 비슷한 옵션이 있을 가능성이 높습니다.
답변2
내가 올바르게 이해했다면 프로세스에 대한 전체 명령줄이 필요합니다.
Linux 또는 *BSD에서는 명령줄을 자르지 않도록 지시하는 명령 ww
에 전달됩니다.ps
ps -A ww
-o args
에 전달하여 인수(명령 이름 포함)를 추출할 수 있습니다 ps
.
ps -o args -A ww
-C java
Linux에서는 이름이 지정된 명령을 실행하는 프로세스만 전달할 수 있습니다 java
.
ps -o args -C java ww
터미널 너비 대신 무한 너비를 얻는 또 다른 방법은 다른 프로그램을 통해 파이프하는 것입니다.
ps -o args -C java | cat
Linux에서는 /proc/$pid/cmdline
프로세스 ID에서 전체 프로세스 명령줄을 검색할 수 있습니다. $pid
명령줄은 인수를 구분하는 null 바이트와 함께 명시적으로 저장되므로 인수에 공백이 포함되어 있어도 괜찮습니다.
답변3
/proc
이런 종류의 작업에는 파일 시스템을 사용하십시오 . 특히, /proc/$PID/maps
"$PID"가 문제의 프로세스 ID인지 살펴보는 것이 좋습니다 . 비슷한 방법을 사용하여 cat /proc/$PID/maps
특정 PID에 대해 매핑된 콘텐츠의 텍스트 버전을 얻을 수 있습니다. cat /proc/self/maps
우선, 이것은 간단한 C 프로그램이 무엇을 매핑하는지 보여줄 것입니다.
Java에서 "cat" 샘플 프로그램을 찾아 실행했습니다 java cat /proc/self/maps
. 이 간단한 "cat"에는 로드 가능한 많은 ".so" 라이브러리가 있지만 rt.jar
.jar 파일에만 매핑됩니다.
답변4
Solaris를 사용하는 경우 다음 중 하나를 사용하여 전체 매개변수 목록을 얻을 수 있습니다.
/usr/ucb/ps -alxww
또는
pargs $pid
추가 권한(일반적으로 루트)이 없으면 자신에게 속하지 않은 프로세스의 잘린 목록이 계속 표시됩니다.
실제로 프로세스 스택도 가져오고 싶은지 확실하지 않지만 경우에 따라 이를 표시하는 명령은 다음과 같습니다(pid가 JVM 프로세스 ID를 포함하는 변수라고 가정).
pstack $pid