Captura a estrutura completa do processo / pilha

3

Existem muitos processos java em execução no servidor, geralmente, capturamos os PIDs dos processos java usando o comando 'ps -ef | grep java '. Em geral, os processos java possuem muitos frascos em sua estrutura, como os seguintes

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

No processo java acima, existem alguns parâmetros que são passados como argumentos para o processo java, como "-DProcessName = ABCD".

No meu caso, para alguns processos Java, existem quase 50 arquivos jar que são carregados quando o processo java é iniciado. Como resultado disso, o resultado do comando ps não está mostrando a estrutura / pilha completa do processo java. Os resultados estão chegando como

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

Alguém pode nos ajudar a rastrear a estrutura / pilha completa do processo java usando o comando ps ou qualquer outro comando?

    
por Kulkarni Rahul Chandra 26.02.2013 / 15:23

4 respostas

2

No RHEL / CentOS no bash shell, isso geralmente é o resultado da saída de truncamento ps. Neste caso, você pode adicionar dois 'w's às opções ps para obter a linha de comando completa:

ps -efww | grep java

Existem mais do que provavelmente opções semelhantes disponíveis para o seu binário de ps, se a opção 'w' não for cumprida ou não estiver disponível.

    
por 26.02.2013 / 15:26
1

Se bem entendi, você quer a linha de comando completa do processo.

No Linux ou * BSD, passe ww para o comando ps para dizer que não truncará as linhas de comando.

ps -A ww

Você pode extrair apenas os argumentos (incluindo o nome do comando) passando -o args para ps .

ps -o args -A ww

No Linux, você pode passar -C java para listar apenas processos executando um comando chamado java .

ps -o args -C java ww

Outra maneira de obter largura ilimitada em vez da largura do terminal é canalizar outro programa.

ps -o args -C java | cat

No Linux, você pode recuperar toda a linha de comando do processo em /proc/$pid/cmdline , em que $pid é o ID do processo. A linha de comando é armazenada de forma não ambígua, com bytes nulos para separar os argumentos, portanto, isso é bom mesmo se os argumentos contiverem espaços.

    
por 27.02.2013 / 02:22
0

Use o sistema de arquivos /proc para esse tipo de coisa. Em particular, acho que você vai querer olhar para /proc/$PID/maps . "$ PID" é o ID do processo em questão. Você pode usar algo como cat /proc/$PID/maps para obter uma versão de texto do que está mapeado em para qualquer PID. cat /proc/self/maps para iniciantes: que mostrará o que um programa C simples mapeia.

Eu encontrei um programa de exemplo "cat" em Java e fiz java cat /proc/self/maps . Esse "gato" simples tinha um grande número de bibliotecas carregáveis ".so", mas apenas rt.jar mapeado como um arquivo .jar.

    
por 26.02.2013 / 19:21
0

Se acontecer de você usar o Solaris, você pode obter a lista completa de argumentos com um dos seguintes:

/usr/ucb/ps -alxww

ou

pargs $pid

Tenha em atenção que continua a obter uma lista truncada para os processos que não possui, a menos que tenha privilégios adicionais (normalmente, sendo root).

Não tenho certeza se você realmente deseja obter a pilha de processos também, mas apenas no caso, o comando para exibi-la seria (supondo que pid seja uma variável contendo o ID do processo da JVM):

pstack $pid
    
por 27.02.2013 / 00:13

Tags