运行 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)滚动,希望找到您正在寻找的内容。