Запустить 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) прокручиваются в надежде, что вы найдете то, что ищете.