如何在 Tomcat Catalina 上运行 strace 或 ltrace?

如何在 Tomcat Catalina 上运行 strace 或 ltrace?

运行 ltrace 并非易事。此 RHEL 5.3 系统基于 Tomcat Catalina(servlet 容器),它使用文本脚本将所有内容绑定在一起。当我尝试查找可执行文件时,我遇到了以下问题:

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

这太丑了。如何在 tomcat 中运行 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

答案1

除非您需要在启动过程中跟踪某些内容,strace否则ltrace两者都有一个-p附加到现有进程并开始跟踪它的参数。一旦 tomcat 运行,您就可以从中获取进程 ID ps,然后运行

strace -p 1234 -e open -o outputfile

或者

ltrace -p 1234 -e open -o outputfile

其中 1234 是进程 ID。

另一种选择是,如果这些“文本文件”是 shell 脚本,那么你应该能够

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

strace 将开始跟踪运行脚本时执行的 shell,-f 将告诉它在分叉和执行每个命令时进行跟踪。您需要过滤输出以找出哪个进程是哪个程序(使用-ff而不是-f会有所帮助)。

答案2

我不知道您运行的是哪个版本的 Tomcat,所以我要在这里进行检查。看起来您运行的 Tomcat 可能嵌入了其他应用程序——init 脚本对我来说似乎不寻常。

但是,在常规 Tomcat 安装的核心中存在 $CATALINA_BASE/bin/catalina.sh。该脚本可用于(并且通常被其他脚本包装)在守护进程配置中启动、停止或从控制台运行 Tomcat。

如果你查看当前的 6.x catalina.sh,在第 306 行(如果你使用安全管理器,则为 297 行),你会看到以下内容:

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

是否可以在exec和之间插入 ltrace 或 strace "$_RUNJAVA"

然后,您可以执行./catalina.sh run并观察 strace(和您的 Tomcat stdout)滚动,希望找到您正在寻找的内容。

相关内容