Назад | Перейти на главную страницу

Как запустить strace или ltrace на Tomcat Catalina?

Запустить ltrace нетривиально. Эта система RHEL 5.3 основана на Tomcat Catalina (контейнер сервлетов), который использует текстовые сценарии, чтобы связать все вместе. Когда я попытался найти исполняемый файл, вот кроличья нора, я упал:

/etc/init.d/pki-ca9 вызывает 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 вызывает сторожевую программу

/usr/bin/nuxwdog -f $FNAME

Заменил nuxwdog на обертку

[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) +++

Это уродливо. Как запустить strace или ltrace в 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

Вот все дети

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

Вот что происходит, когда я пытаюсь запустить ltrace для текстового скрипта

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

Когда я прикрепляю ltrace к родительскому элементу и позволяю ему работать в течение дня, вывода нет

[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

Если вам не нужно что-то отслеживать в процессе запуска, strace и ltrace у обоих есть -p параметр, который присоединяется к существующему процессу и начинает его трассировку. После запуска tomcat вы получите идентификатор процесса из ps, и запустить

strace -p 1234 -e open -o outputfile

или

ltrace -p 1234 -e open -o outputfile

где 1234 - идентификатор процесса.

Другой вариант, если эти "текстовые файлы" являются сценариями оболочки, вы сможете

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

strace начнет отслеживать оболочку, выполняемую для запуска сценария, -f укажет ей следовать, когда она разветвляется и выполняет каждую команду. Вам нужно будет отфильтровать вывод, чтобы выяснить, какой процесс какой программой (используя -ff вместо того -f поможет).

Я не знаю, какую версию Tomcat вы используете, поэтому я собираюсь попробовать здесь. Похоже, вы используете Tomcat, который может быть встроен в какое-то другое приложение - сценарии инициализации кажутся мне необычными.

Однако в основе стандартной установки Tomcat лежит $ CATALINA_BASE / bin / catalina.sh. Этот сценарий можно использовать (и часто он оборачивается другими сценариями) для запуска, остановки в конфигурации демона или запуска Tomcat с консоли.

Если вы посмотрите на текущую версию 6.x catalina.sh в строке 306 (297, если вы используете диспетчер безопасности), вы увидите следующее:

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

Можно ли вставить ltrace или strace между exec и "$_RUNJAVA"?

Тогда ты можешь сделать ./catalina.sh run и наблюдайте, как strace (и ваш Tomcat stdout) прокручиваются в надежде, что вы найдете то, что ищете.