java 进程消失_Java进程诡异消失问题

最新在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 in command line.

Please select an available pid.

运行arthas的时候报错,找不到Java进程,但是通过 ps -ef | grep java发现:

image.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进程了。

你可能感兴趣的:(java,进程消失)