btrace 常见问题
执行btrace命令报错:Unable to open socket file: target process not responding or HotSpot VM not loaded
-------------------------------------------------------------------------------------------
-bash-4.1# /apps/svr/jdk7/bin/jstack/jps -l
32382 sun.tools.jps.Jps
20150 com.sun.btrace.client.Main
-------------------------------------------------------------------------------------------
-bash-4.1# /apps/svr/jdk7/bin/jstack -l 284
284: Unable to open socket file: target process not responding or HotSpot VM not loaded
-------------------------------------------------------------------------------------------
-bash-4.1# /apps/svr/jdk7/bin/jstack -J-d64 -m 284
Attaching to process ID 284, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
-------------------------------------------------------------------------------------------
jstack报错:Unable to open socket file。是因为这个java进程的pid文件删除了
-bash-4.1# sudo -u root /apps/svr/jdk7/bin/jstack 284
284: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
-------------------------------------------------------------------------------------------
linux操作系统为了防止/tmp目录文件过多,有个删除管理机制:tmpwatch
-bash-4.1# cat /etc/cron.daily/tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
-X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
-------------------------------------------------------------------------------------------
高版本jps、jstack不能工作原因:
这是一个从Java 6 update 21 引入的bug sunbug 7009828,在Java 6 update 25修复。
具体原因是: jdk16_21/24开始,jvm启动时产生进程号的临时文件目录优先使用-Djava.io.tmpdir指定的目录,没有指定-Djava.io.tmpdir参数才使用/tmp/hsperfdata_$USER。
正好tomcat指定了-Djava.io.tmpdir=${tomcat_home}/tmp/。而jps、jstack从/tmp/hsperfdata_$USER目录读取不到pid信息,所以才报错。
原因二:
因为目标进程是另一个用户启动的,所以用root用户就jmap不了,换启动进程的那个用户就行了
第2次如果再次用root用户输入这个命令,会报另一个错误:well-known file is not secure
原因也是一样,目标进程是哪个用户启动的,就要用哪个用户来执行jmap命令 。
查看端口:
netstat -nlp | grep 2020
-------------------------------------------------------------------------------------------
sshpass -p pwd ssh -o StrictHostKeyChecking=no -p 22 root@127.0.0.1 nohup /btrace/bin/btrace -p 2020 -cp fastjson.jar 28541 CodeTrace.java >> /home/btrace/20170811.log &
当另外一个用户执行脚本会报:well-known file is not secure,文件可能会僵死,不能写入文件,btrace进程也不能启动,这个问题造成我查了半天的时间。
原因解析:
/home/btrace/20170811.log 文件是root用户创建的,然后用app用户执行命令输出该文件,会导致命令无法启动,且没有任何错误日志。
-------------------------------------------------------------------------------------------
使用java process 执行 sshpass ssh tail grep 命令,日志不能实时:
原因:由于tail -f 在尾部没有终止,所以数据可能仍在管道缓冲中。使用tail -f file | unbuffer -p grep keyword
上面如果tail -f /logs/* | unbuffer -p keyword 就会报201错误,可以改成如下:
tail -f file | grep --line-buffered my_pattern
-------------------------------------------------------------------------------------------
排查java oom问题:
统计下目前的线程数(例如ps -eLf | grep java -c),然后可以看看ulimit -u的限制值是多少,如线程数已经达到限制值,如限制值可调整,则可通过调整限制值来解决。
-------------------------------------------------------------------------------------------
java使用process执行ssh tail命令后,ssh连接断开后关闭远程开启的进程的方法:
ssh -t user@remote_host tail -f /some/file OR ssh -tt user@remote_host tail -f /some/file
How to terminate remotely called “tail -f” when connection is closed?
-------------------------------------------------------------------------------------------