运行ltrace不是微不足道的。 这个RHEL 5.3系统基于一个Tomcat Catalina(servlet容器),它使用文本脚本将所有内容绑定在一起。 当我试图在这里find一个可执行文件的时候,我就下了个兔子洞:
/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?
UPDATE
这里是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获得进程ID,并运行
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将开始跟踪执行的脚本来运行脚本,-f会告诉它跟随,因为它会分叉并执行每个命令。 您需要通过输出来筛选哪个进程是哪个进程(使用-ff而不是-f将会有所帮助)。
我不知道你正在运行的是什么版本的Tomcat,所以我会在这里拿一个赃物。 看起来你正在运行一个可能embedded其他应用程序的Tomcat – init脚本对我来说看起来并不常见。
但是,在股票Tomcat安装的核心,有$ CATALINA_BASE / bin / catalina.sh。 可以使用该脚本(通常由其他脚本进行时间包装)启动,停止在守护进程configuration中或从控制台运行Tomcat。
如果你看看目前的6.x catalina.sh,在306行(如果你使用的是安全pipe理器,297),你会看到:
exec "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \ ... snip ...
在exec和"$_RUNJAVA"之间插入ltrace或strace是否可能?
然后,你可以做./catalina.sh run并观看strace(和你的Tomcat stdout)滚动,希望你find你正在寻找。