首先咱們要使用root用戶關閉selinux,這一步不少使用CentOS和紅帽的運維人員都會裝機完就關閉selinux,並非多新鮮的事情了java
setenforce 0
而後咱們須要賦予zabbix用戶sudo到root的權限,這波操做很是神奇,下面是在RHEL 7下面的操做,RHEL6也相似。linux
在/etc/sudoers.d下面新建一個名爲zabbix的文件,裏面填寫在何種狀況下容許zabbix提高到root權限,內容以下:tomcat
zabbix ALL=(ALL) NOPASSWD: /usr/local/bin/jstat.sh *
上面那句話就是zabbix能夠在執行/usr/local/bin/jstat.sh這個腳本的時候sudo到root權限,並且不須要輸入root的密碼,這樣一來實際上是很是危險的,其餘人只要修改上面腳本的內容,就能夠輕鬆的經過黑進zabbix獲取root權限。因此這個腳本要配置成只讀的,起碼對於root之外的用戶要沒法修改才行。要是你連這個腳本都不限定,直接容許zabbix直接獲取root權限,那就更危險了。bash
因爲zabbix用戶是沒有終端權限的,這一點能夠在/etc/passwd中看到/sbin/nologin 的配置,因此咱們還須要取消sudo必須有tty權限的系統默認設定,方法就是修改/etc/sudoers這個文件,但首先須要將這個文件添加可讀寫權限,不然即便是root也沒法修改這個文件服務器
chmod +w /etc/sudoers
而後vi編輯這個文件,找到 Defaults requiretty 這一行,改爲,加一個歎號運維
Defaults !requiretty
而後咱們的zabbix如今已經擁有了執行jstat的權限,能夠開始編寫相關腳本了。這個腳本接收兩個參數ui
第一個參數是你要獲取哪一個內存區域的名稱,好比Eden,Old,Perm等等spa
第二個參數是進程的名稱的關鍵字,方便根據這個名稱去獲取這個進程的Pid,這個名稱要有惟一性,能夠經過ps -ef而後仔細觀察Tomcat或者其餘中間件創建的進程來得到。好比tomcat在啓動的時候通常會把配置文件寫在進程信息中,因而我就把這個配置文件的路徑做爲關鍵字.net
而後腳本就會自動獲取這個進程所對應的Pid,而後分析是JDK 1.8仍是1.7 1.6,執行jstat命令,而後經過awk獲取相關內存區域的百分比,提供給zabbix server。腳本以下,腳本路徑爲/usr/local/bin/jstat.sh,注意下面的JAVA_HOME等參數要根據你服務器的實際路徑去修改。3d
#!/bin/bash JAVA8_HOME=/usr/jdk1.8.0_91/ JAVA7_HOME=/usr/jdk1.7.0_79/ JAVA6_HOME=/usr/jdk1.6.0_27/ JHOME=/usr/ function Survivor0 { $JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $1}' } function Survivor1 { $JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $2}' } function Eden { $JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $3}' } function Old { $JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $4}' } function Perm { $JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $5}' } function Metaspace { $JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $5}' } process=$(ps -ef | grep "$2" | grep -v 'jstat' | grep -v 'grep' | awk 'NR==1 {print $0}') pid=$(echo $process | awk '{print $2}') java8=$(echo $process | grep jdk1.8) java7=$(echo $process | grep jdk1.7) java6=$(echo $process | grep jdk1.6) if [ ! -z "$java8" ];then JHOME=$JAVA8_HOME elif [ ! -z "$java7" ];then JHOME=$JAVA7_HOME elif [ ! -z "$java6" ];then JHOME=$JAVA6_HOME fi $1 "$2"
注意,使用ps -ef | grep「進程名」的時候,因爲zabbix腳本自己會帶有一個進程名參數,grep命令也會帶有一個進程名參數,因此這條命令執行出來至少有三個進程符合條件,因此上面使用了兩遍 grep -v命令來去除干擾項,而後若是還有多個進程知足該關鍵字,只會去結果裏的第一行。
而後咱們就把咱們的這個自定義腳本增長到被監控服務器的zabbix客戶端配置文件裏,方法就是新建一個/etc/zabbix/zabbix_agentd.d/userparameter_jstat.conf文件,內容以下
UserParameter=custom.jstat[*],sudo /usr/local/bin/jstat.sh $1 $2
注意上面是經過sudo提高了權限
而後使咱們剛加的自定義key在zabbix客戶機上生效
service zabbix-agent restart
而後咱們就能夠到zabbix server上來探測腳本是否能夠正常運行
[alex@localhost ~]$ zabbix_get -s 192.168.1.2 -k custom.jstat[Old,tomcat]
35.86
若是能正常出現一個百分數,那麼就說明成功了,下面咱們能夠到zabbix網頁端添加相關的監控項和圖像。其中主要就是把key填寫正確就好
而後重複上面的步驟,將你須要觀察的項目都添加相應的監控項,注意JDK 1.8以後Perm區變成了MetaSpace區
而後再創建圖形,上面創建的五個監控項都添加到圖形中去
而後等待一會就能夠看見效果啦
JDK 1.7效果
JDK 1.8效果