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?

 -------------------------------------------------------------------------------------------

Linux ssh登录慢的问题解决方案

原文地址:https://www.cnblogs.com/ThinkVenus/p/7295020.html