cszer

简单的系统监控脚本

分类: 技术, Linux 运维, shell   标签:    评论: 2   阅读:2,636 views

周末抽空写了个系统监控脚本,没什么技术含量,就当练练手。
花了不少时间,主要在一些细节上处理得不够严谨,比如awk调用系统变量时需要同时使用单双引号,如”‘$变量名'”
看来自己的脚本撰写能力还有待提高。下面是脚本内容:

system_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
#!/bin/bash
 
#system monitor
#caishzh 20120418 create
 
 
#初始化变量并设置阀值
DIR=/root/tool
ADMIN=***@qq.com
#ADMIN_SMS=***@139.com   #可以配合139邮箱实现短信警报
>${DIR}/messages.txt
 
IP=$(ifconfig eth0|grep 'inet addr'|sed 's/.*addr:\(.*\) Bcast:.*/\1/')
HOSTNAME=$(hostname)
 
CPU_MAX=90		#单个进程的cpu使用率
UPTIME_MAX=3	#系统负载
DISK_MAX=90		#磁盘使用率
 
#设置一个flag,用于脚本的执行与否;0执行,1不执行
#FLAG=$(cat /root/tool/flag.txt)
#[ $FLAG -eq 1 ] && { exit 1 }
 
#进程占用cpu情况
CPU_MAX_NUM=$(top -n 1 -b|awk 'NR>7{if ($10>"'$CPU_MAX'")print  $10}'|wc -l)	#统计cpu使用率超过90%的进程数
if [ "$CPU_MAX_NUM" -gt 0 ];then
	sleep 5
	CPU_MAX_NUM=$(top -n 1|awk 'NR>7{if ($10>"'$CPU_MAX'")print  $10}'|wc -l)
        [ $CPU_MAX_NUM -gt 0 ] && $(echo "CPU_${CPU_MAX}%_NUM: $CPU_MAX_NUM" >>${DIR}/messages.txt)
fi
 
#系统负载
UPTIME=$(uptime|awk '{print $10}'|sed 's/\..*//')
[ "$UPTIME" -gt "$UPTIME_MAX" ] && $(echo "UPTIME: $UPTIME" >>${DIR}/messages.txt)
 
#监控磁盘空间
DISK=$(df -h |awk 'NR>1{print $0}'|sort -k5|tail -1|awk '{print $1,$4,$5}')  #提取磁盘占用率最大的分区
DISK_USAGE=$(echo $DISK|awk '{print $3}'|tr -d '%')
[ "$DISK_USAGE" -ge "$DISK_MAX" ] && $(echo "DISK: $DISK" >> ${DIR}/messages.txt)
 
#监控文件系统(filesystem)
[ -f "${DIR}/fs.txt" ] || $(df -T|grep -v tmpfs|awk 'NR>1{print $1,$2}'>${DIR}/fs.txt)  #将所有分区及其文件系统类型输出到fs.txt文件中
while read FS
do
	PARTITION=$(echo $FS|awk '{print $1}')  #提取分区名
	FILESYSTEM=$(echo $FS|awk '{print $2}')  #提取文件系统类型
	[ "$FILESYSTEM" == "ext4" ] && CMD="/sbin/tune4fs" || CMD="/sbin/tune2fs"
	FS_STAT=$($CMD -l $PARTITION | grep 'Filesystem state')
	echo $FS_STAT|grep 'clean$'>/dev/null
	if [ $? -eq 1 ];then
		echo "$PARTITION : $FS_STAT" >>${DIR}/messages.txt
	fi
done<${DIR}/fs.txt
 
#监控iptables
/sbin/iptables -nL|grep 'INPUT'|grep 'policy ACCEPT' >/dev/null && echo "iptables: policy ACCEPT">>${DIR}/messages.txt
 
#发送警报邮件
if [ -s ${DIR}/messages.txt ];then  #如果messages.txt文件不为空则发送警报信
	mail -s "system monitor: $IP  $HOSTNAME" "$ADMIN" <${DIR}/messages.txt
fi

将脚本放入/root/tool目录,给予脚本执行权限:

chmod 755 /root/tool/system_monitor.sh

将脚本写入crontab,每5分钟执行一次:

echo "*/5 * * * * root /root/tool/system_monitor.sh" >>/etc/crontab

在vps上测试,系统出现异常时发送的邮件内容(为了测试脚本,有将部分阀值调低):
system_monitor

除非注明,文章皆由( csz )原创,转载请标明本文地址
本文地址: http://www.cszhi.com/20120422/system_monitor.html

04-22
2012

2 Comments for 简单的系统监控脚本

发表评论

Trackbacks and Pingbacks: