有时候,当你需要远程监控你服务器上的程序的运行情况,该怎么办呢?
其实jdk里面就已经给我们提供了相关的工具,JConsole就是一个很好的JMX工具。下面来看下怎么使用。
不需要用户认证的连接
如下图,我新建了一个名为demo-0.0.1-SNAPSHOT.jar
的应用,
然后我们用一下命令来运行这个项目:
java -Djava.rmi.server.hostname=192.168.37.129 -Djava.security.policy=jstatd.all.policy -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=5678 -Xms1g -Xmxg -jar demo-0.0.1-SNAPSHOT.jar
其中
hostname
:为远程服务器的地址,port
:jmx访问的端口。需要注意的是,利用JConsole工具进行连接的之前,要把服务器的JMX访问的防火墙端口关闭,这里是5678。- authenticate:是否需要进行身份验证
- ssl : 是否允许使用ssl方式接入
然后运行 %JAVA_HOME%/bin/jconsole.exe
,即你本地的java环境下的bin目录下的工具jconsole,填上刚才配置的地址和端口,就可以连接了。
连接成功后,如下图所示,你就可以看到堆内存、线程、cpu等信息的波动曲线了:
需要用户认证的连接
虽然上述方法已经可以登录进入了,但是线上服务我们最好需要用户认证登录才算是比较安全合理的。下面就来看看 如何给登录添加用户认证吧!
首先切换到你服务器环境安装的${JAVA_PATH}/jre/lib/management
环境下,找到对应的文件:
cd /usr/local/jdk1.8.0_161/jre/lib/management
你会看到一个jmxremote.password.template
文件 。
因为jmxremote.password.template
为不可写文件 ,将其复制出来另一份,赋予写权限,修改相关内容:
cp jmxremote.password.template jmxremote.password //复制除另一份取名为 jmxremote.password
chmod +w jmxremote.password //赋予写权限
vi jmxremote.password //编辑
编辑后的内容很简单,打开倒数第二行monitorRole QED
的注释,同时修改字段值,如下:
然后就可以运行项目,用一下命令,将authenticate
字段值改为true
:
java -Djava.rmi.server.hostname=192.168.37.129 -Djava.security.policy=jstatd.all.policy -Dcom.sun.management.jmxremote.authenticate=true-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=5678 -Xms1g -Xmx1g -jar demo-0.0.1-SNAPSHOT.jar
如果你觉得命令太长,你可以把部分新建一个环境变量追加到到系统环境/etc/profile
文件的尾部中去:
echo "export JAVA_ARGS='-Djava.rmi.server.hostname=192.168.37.129 -Djava.security.policy=jstatd.all.policy -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=5678''">> /etc/profile //追加JAVA_ARGS环境变量
source /etc/profile //即时生效
那么,你可以用以下较短的命令来运行项目了:
java $JAVA_ARGS -Xms1g -Xmx1g -jar demo-0.0.1-SNAPSHOT.jar
可以看到,这里说 jmxremote.password文件没有读取访问权限,那么我们 再给它赋予权限:
chmod 700 jmxremote.password jmxremote.access
再运行,就没有问题了。
项目跑起来后,就可以使用JConsole工具来使用用户认证方式连接了。