简单的系统监控脚本

周末抽空写了个系统监控脚本,没什么技术含量,就当练练手。
花了不少时间,主要在一些细节上处理得不够严谨,比如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目录,给予脚本执行权限:

1
chmod 755 /root/tool/system_monitor.sh

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

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

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

1567520457752