Como eu executo strace ou ltrace no Tomcat Catalina?

2

Executar o ltrace não é trivial. Este sistema RHEL 5.3 baseia-se em um Tomcat Catalina (contêiner de servlet) que usa scripts de texto para unir tudo. Quando eu tentei encontrar um executável, aqui está o buraco do coelho em que caí:

/etc/init.d/pki-ca9 chama dtomcat5-pki-ca9

#Path to the tomcat launch script (direct don't use wrapper)
TOMCAT_SCRIPT=/usr/bin/dtomcat5-pki-ca9

/ usr / bin / dtomcat5-pki-ca9 chama um programa de vigilância

/usr/bin/nuxwdog -f $FNAME

Eu substitui o nuxwdog por um wrapper

[root@qantas]# cat /usr/bin/nuxwdog
#!/bin/bash
ltrace -e open -o /tmp/ltrace.$(date +%s) /usr/bin/nuxwdog.bak $@

[root@qantas]# service pki-ca9 start
Starting pki-ca9:              [  OK  ]

[root@qantas]# cat /tmp/ltrace.1295036985
+++ exited (status 1) +++

Isso é feio. Como eu corro strace ou ltrace no tomcat?

UPDATE

Aqui está o "processo" do tomcat

[root@qantas]# ps -ef | grep tomcat
pkiuser  21767 21766  0 10:10 ?        00:00:09 /usr/lib/jvm/jre/bin/java
 -Djava.endorsed.dirs=/usr/share/tomcat5/common/endorsed
 -classpath :/usr/lib/jvm/jre/lib/rt.jar:/usr/share/java/commons-
collections.jar:/usr/share/tomcat5/bin/bootstrap.jar:/usr/share/tomcat5/bin/commons-
logging-api.jar:/usr/share/java/mx4j/mx4j-impl.jar:/usr/share/java/mx4j/mx4j-
jmx.jar:/usr/share/tomcat5/common/lib/nuxwdog.jar -Dcatalina.base=/var/lib/pki-ca11
 -Dcatalina.home=/usr/share/tomcat5 -Djava.io.tmpdir=/usr/share/tomcat5/temp
 org.apache.catalina.startup.Bootstrap start

Aqui estão todas as crianças

[root@qantas]# pstree -A -p 21767
java(21767)-+-{java}(21768)
            |-{java}(21769)
            |-{java}(21770)
            <..snip..>
            '-{java}(22104)

Isso é o que acontece quando tento iniciar o ltrace no script de texto

[root@qantas]# ltrace /usr/bin/dtomcat5-pki-ca11
ltrace: Can't open ELF file "/usr/bin/dtomcat5-pki-ca11"

Quando eu participo o ltrace ao pai e deixo ele rodar por um dia, não há saída

[root@qantas]# ltrace -e open -o /tmp/ltrace.1295465058 -p 21767

...24 hours later...

[root@qantas]# ls -l /tmp/ltrace.1295465058
-rw-r--r-- 1 root root 0 Jan 19 11:24 /tmp/ltrace.1295465058
    
por flashnode 14.01.2011 / 22:00

2 respostas

5

A menos que você precise rastrear algo no processo de inicialização, strace e ltrace têm um parâmetro -p que é anexado a um processo existente e começa a rastreá-lo. Quando o tomcat estiver em execução, você obterá o ID do processo de ps e executará

strace -p 1234 -e open -o outputfile

ou

ltrace -p 1234 -e open -o outputfile

em que 1234 é o ID do processo.

A outra opção, se esses "arquivos de texto" forem scripts de shell, você poderá

strace -f -e whatever -o whatever start-tomcat.sh

strace começará a rastrear o shell executado para executar o script, o -f dirá a ele para seguir como ele se bifurca e executa cada comando. Você precisará filtrar a saída para descobrir qual processo é qual programa (usar -ff em vez de -f ajudará).

    
por 15.01.2011 / 00:44
1

Eu não sei qual versão do Tomcat você está usando, então vou dar um jeito aqui. Parece que você está executando um Tomcat que pode estar embutido em algum outro aplicativo - os scripts de inicialização parecem incomuns para mim.

No entanto, no núcleo de uma instalação Tomcat de ações, há $ CATALINA_BASE / bin / catalina.sh. Esse script pode ser usado (e geralmente é encerrado por outros scripts) para iniciar, parar em uma configuração de daemon ou executar o Tomcat no console.

Se você olhar para o atual catalina.sh 6.x, na linha 306 (297 se estiver usando o gerenciador de segurança), verá o seguinte:

exec "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \
... snip ...

Seria possível inserir seu ltrace ou strace entre exec e "$_RUNJAVA" ?

Então você pode fazer ./catalina.sh run e assistir a strace (e sua stdout do Tomcat) rolar na esperança de encontrar o que está procurando.

    
por 21.01.2011 / 03:29