需求:项目由原来的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。
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