arthas调试tomcat中java程序

1 篇文章 0 订阅
1 篇文章 0 订阅

需求:项目由原来的jar包改成war包,使用tomcat发布,修改之后发现arthas无法使用。

记录使用过程

1、执行java -jar arthas-boo.jar,提示 Can not find java process. Try to run `jps` command lists the instrumented Java Hotspot VMs on the target system.

 2、执行jps,提示 Error Could not find libjava.so,Error :Could not find Java SE Runtime Environment.

3、这个问题是因为linux中env设置PATH的变量是顺序有问题。,使用vi /etc/profile,将JAVA_HOME提前,

即export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH,然后执行source /etc/profile即可,

4、此时再执行jps,即可找到对应的进程号。当然,这还不时arthas要attach的进程号

 5、还有一种可能是tomcat的启动用户与当前用户不一致导致无法attach。

如何查看当前java服务是用户发布可以使用:ps aux|grep 端口号 来查看,第一行就是java服务运行时使用的用户,然后使用sudo su 用户名 命令切换用户到相同级别的用户,然后我们就可以快乐的运行arthas了。

 对于我来说不是这个问题,我的tomcat 启动和当前用户都是root。

6、从github上拿了源码看了一下,arthas找java进程是通过/tmp/hsperfdata_root/下文件,而我的是空的。
7、我的tomcat是通过systemctl启动的,其中有一行设置是 PrivateTmp=true ,这个设置为true会生成自己的tmp路径,如下:

 8、把PrivateTmp=true,这一行需要删掉或改成false,之后执行systemctl daemon-reload 生效,此时在/tmp/hsperfdata_root/下就会生成对应的文件。

此时再执行 jsp,即可看到tomcat的进程号了。

再执行java -jar arthas-boot.jar,就可以attach了

 

  systemctl 配置如下:

[Unit]  
Description=Apache Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target  
  
[Service]  
Type=forking   
Environment="JAVA_HOME=/usr/local/jdk/jdk1.8.0_291/jre/"  
PIDFile=/usr/local/apache-tomcat-9.0.64/tomcat.pid
ExecStart=/usr/local/apache-tomcat-9.0.64/bin/startup.sh  
ExecReload=/bin/kill -s HUP $MAINPID  
ExecStop=/bin/kill -s QUIT $MAINPID  
#这一行需要删掉或改成false
#PrivateTmp=true  
User=root
Group=root
  
[Install]  
WantedBy=multi-user.target

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值