该shell脚本主要用于监控各个进程的jvm内存使用情况,脚本名称:jvm-monitor.sh,具体脚本如下:
[root@loong /]#more jvm-monitor.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 1#!/bin/bash
2export JAVA_PATH=/callcent/jdk1.6.0_25
3export PATH=$PATH:$JAVA_PATH/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
4sysdate=date
5
6for pid in jps -v |grep weblogic|grep -v AdminServer |awk '{print $1}'
7
8do
9addr=ifconfig -a|grep -w inet|grep -v 127.0.0.1|grep -v 172.16.1.1|awk '{print $2}'|cut -d : -f 2
10java_name=$(ps -ef|grep weblogic|grep $pid|grep -v AdminServer)
11name=echo ${java_name}|sed 's/^.\*-Dweblogic.Name=//g'|awk '{print $1}'
12
13#jvm内存监控
14echo ###########################################
15echo $sysdate
16echo pid $pid
17echo name $name
18echo $addr
19
20if [ "$pid" = "" ]
21then
22echo "the program is not exists."
23exit 0
24fi
25
26heap=$(jmap -heap ${pid})
27
28eden=echo ${heap}|sed 's/^.*Eden Space://g'|sed 's/From Space.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
29from=echo ${heap}|sed 's/^.*From Space://g'|sed 's/To Space.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
30tospc=echo ${heap}|sed 's/^.*To Space://g'|sed 's/tenured generation.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
31oldge=echo ${heap}|sed 's/^.*PS Old Generation//g'|sed 's/Perm Generation.*$//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-6
32perm=echo ${heap}|sed 's/^.*PS Perm Generation//g'|awk '{print $13}'|sed 's/%.*$//g'|cut -b 1-66
33
34echo "Eden Space: ${eden}%"
35echo "From Space: ${from}%"
36echo "To Space: ${tospc}%"
37echo "Old Generation: ${oldge}%"
38echo "Perm Generation: ${perm}%"
39
40eden1=gawk -v x=$eden -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
41from1=gawk -v x=$from -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
42tospc1=gawk -v x=$tospc -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
43oldge1=gawk -v x=$oldge -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
44perm1=gawk -v x=$perm -v y=1000 'BEGIN{printf "%.0f\n",x*y}'
45
46#取对应进程的jvm内存值
47for name1 in $name
48do
49
50if [ ${eden1} -ge "99999" ]
51then
52jvm=$jvm+${name1}+":Eden Space:"+${eden}+"%超阀值 "
53fi
54
55if [ ${from1} -ge "99999" ]
56then
57jvm=$jvm+${name1}+":From Space:"+${from}+"%超阀值 "
58fi
59
60if [ ${tospc1} -ge "99999" ]
61then
62jvm=$jvm+${name1}+":To Space:"+${topspc}+"%超阀值 "
63fi
64
65if [ ${oldge1} -ge "99999" ]
66then
67jvm=$jvm+${name1}+":Old Generation:"+${oldge}+"%超阀值 "
68fi
69
70if [ ${perm1} -ge "99999" ]
71then
72jvm=$jvm+${name1}+":Perm Generation:"+${perm}+"%超阀值 "
73fi
74
75echo $jvm
76done
77
78#端口监控
79if [ "$name" = "baobiao" ]
80then
81port='91400'
82fi
83
84if [ "$name" = "csr" ]
85then
86port='91200'
87fi
88
89if [ "$name" = "sso" ]
90then
91port=91500
92fi
93
94if [ "$name" = "gongdan" ]
95then
96port=91100
97fi
98
99if [ "$name" = "manager" ]
100then
101port=91300
102fi
103
104if [ "$name" = "cron" ]
105then
106port=91090
107fi
108
109net=netstat -an |grep $port|grep LISTEN|grep $addr
110
111if [ "$net" = "" ]
112then
113p1=$p1+${port}+"端口异常"
114fi
115
116#echo $pid
117#echo $port
118#echo $name
119
120done
121#p2=$p1+"端口异常"
122
123#url监控
124http=curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" http://www.callcent.kefu.com/sso/jsp/login.jsp
125
126#echo $http
127
128if [ "$http" != "200" ]
129then
130http1="统一登陆页面http://www.xxxxxx.com/sso/jsp/login.jsp访问异常"
131fi
132
133echo $p1
134echo $addr
135echo $http1
136
137#发送告警信息
138if [ -n "$p1" -o -n "$http1" -o -n "$jvm" ]
139then
140curl -d "action=SendMessage&msg=ip:${addr} $jvm ${p1} ${http1};&usernames=user1;user2" http://172.xx.xx.xxx:8090/TestService.ashx
141fi
142
通过定时任务调用该脚本(该脚本每30秒执行一次):
* * * * * /monitor/script/monitor19.sh >> /monitor/log.txt
[root@loong /]#more /monitor/script/monitor19.sh
1
2
3
4
5
6
7
8
9
10
11
12 1#!/bin/bash
2export JAVA_PATH=/callcent/jdk1.6.0_25
3export PATH=$PATH:$JAVA_PATH/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
4
5step=30 #间隔的秒数,不能大于60,表示每半分钟执行一次
6
7for (( i = 0; i < 60; i=(i+step) )); do
8/monitor/script/jvm-monitor.sh
9sleep $step
10done
11exit 0
12