最新在Centos 7.6上起了一个新的Jboss,并在其中起了我们的server,但是在使用arthas的过程中发现一个问题。
[root@tmsprod4 ~]# java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.1
[INFO] Can not find java process. Try to pass <pid> in command line.
Please select an available pid.
运行arthas的时候报错,找不到Java进程,但是通过 ps -ef | grep java
发现:
![](https://img.haomeiwen.com/i6051634/f2b774afd2fe1100.png)
有很多Java进程,然后通过Jps命令去列出Java进程的时候:
[root@tmsuat1 ~]# jps
30053 Jps
确实找不到Java进程,这是为什么?后来通过查询资料才知道,Linux系统下java进程启动的时候,会在/tmp/hsperfdata_root/
目录下创建一个以Java进程id命名的文件,并在其中记录jvm等相关信息,运行Jps命令的时候,会访问该目录下的文件,从而输出Java进程,于是就到/tmp/hsperfdata_root/
这个目录下查看了一下:
[root@tmsuat1 ~]# cd /tmp/hsperfdata_root/
[root@tmsuat1 hsperfdata_root]# ls
[root@tmsuat1 hsperfdata_root]# ls -al
total 8
drwxr-xr-x 2 root root 4096 Oct 31 20:51 .
drwxrwxrwt. 10 root root 4096 Oct 31 03:13 ..
[root@tmsuat1 hsperfdata_root]#
果然没有任何文件,这也就解释了为什么运行arthas会报Can not find java process,也解释了为什么Jps找不到Java进程的原因。于是基于这个发现查询为什么在Centos7下启动Java进程不向/tmp/hsperfdata_root/
写入进程信息。查到的原因是Jboss是通过建立service启动的,而在Centos7下是通过systemctl启动service的,并在/usr/lib/systemd/system新建一个脚本:
[Unit]
Description=jbossapi
[Service]
Type=forking
PIDFile=/run/jboss-as/jboss-as-domain.pid
EnvironmentFile=-/etc/jboss-as/jboss-as-domain.conf
ExecStart=/jboss-eap-6.4/bin/init.d/jboss-as-domain.sh start
ExecReload=/jboss-eap-6.4/bin/init.d/jboss-as-domain.sh restart
ExecStop=/jboss-eap-6.4/bin/init.d/jboss-as-domain.sh stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
而其中的privateTmp这个属性正是原因所在,在centos7下面/tmp这个目录权限是777,任何人都可以查看,centos7认为这样不安全,容易泄露信息,于是官方启动脚本里就有PrivateTmp=true这么一句,这样一来Jboss启动后,就不会把相关信息写入/tmp目录里,也就造成jps无法看到java进程了。将该句从脚本中去除,并重启service既可以通过jps查看Java进程了。
网友评论