Захват полной структуры процесса / стека

На сервере много процессов java, как правило, мы захватываем PID из java-процессов с помощью команды ps -ef | grep java '. В общем, в java-процессах есть много банок в их структуре, например, следующее

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-процессе есть несколько параметров, которые передаются в качестве аргументов в процесс java, например «-DProcessName = ABCD».

В моем случае для нескольких процессов java существует почти 50 файлов jar, которые загружаются при запуске java-процесса. В результате этого результат команды ps не показывает полную структуру / стек java-процесса. Результаты приближаются

 java -DCORDYS_INSTALL_DIR=/opt/abcd/clouprod01 -cp "/opt/abcd/clouprod01/scp.jar:/opt/abcd/clouprod01/scp.jar: 

Может ли кто-нибудь помочь нам в отслеживании полной структуры / стека java-процесса с помощью команды ps или любой другой команды?

В RHEL / CentOS в оболочке bash это обычно является результатом усечения вывода ps. В этом случае вы можете добавить две опции w в ps, чтобы получить полную командную строку:

ps -efww | grep java

Есть более чем похожие варианты, доступные для вашего двоичного файла ps, если опция «w» не выполняет его или недоступна.

Если я правильно понимаю, вам нужна полная командная строка процесса.

Под Linux или * BSD передайте ww команде ps чтобы сообщить об этом, чтобы не усекать командные строки.

 ps -A ww 

Вы можете извлечь только аргументы (включая имя команды), передав -o args в ps .

 ps -o args -A ww 

В Linux вы можете передать -C java чтобы перечислять только процессы, выполняющие команду java .

 ps -o args -C java ww 

Другой способ получить неограниченную ширину вместо ширины терминала – пропустить другую программу.

 ps -o args -C java | cat 

В Linux вы можете получить всю командную строку процесса из /proc/$pid/cmdline где $pid – это идентификатор процесса. Командная строка хранится недвусмысленно с нулевыми байтами для разделения аргументов, поэтому это хорошо, даже если аргументы содержат пробелы.

Используйте файловую систему /proc для такого рода вещей. В частности, я думаю, вы захотите посмотреть /proc/$PID/maps . «$ PID» – это идентификатор процесса. Вы можете использовать что-то вроде cat /proc/$PID/maps чтобы получить текстовую версию того, что отображается в где для любого данного PID. cat /proc/self/maps для стартеров: это покажет вам, в какую карту входит программа C.

Я нашел программу примера «cat» в Java и сделал java cat /proc/self/maps . У этого простого «кота» было большое количество загружаемых библиотек «.so», но только rt.jar отображался как файл .jar.

Если вы используете Solaris, вы можете получить полный список аргументов одним из следующих:

 /usr/ucb/ps -alxww 

или

 pargs $pid 

Помните, что вы все равно получите усеченный список для тех процессов, которые вы не владеете, если у вас нет дополнительных привилегий (обычно это root).

Не уверен, что вы действительно хотите получить стек процесса, но на всякий случай команда для его отображения будет (если pid – это переменная, содержащая идентификатор процесса JVM):

 pstack $pid