周末抽空写了个系统监控脚本,没什么技术含量,就当练练手。
花了不少时间,主要在一些细节上处理得不够严谨,比如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 >${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上测试,系统出现异常时发送的邮件内容(为了测试脚本,有将部分阀值调低):
