这段代码是一个 Bash 脚本,用于监控 Linux 服务器的 CPU 和内存使用情况,并在达到特定阈值时发送邮件通知。下面是对代码的详细分析:
1. 环境设置
export PATH
export LANG=zh_CN.UTF-8
export PATH
:确保脚本可以使用系统的命令。export LANG=zh_CN.UTF-8
:设置系统语言为简体中文。
2. 依赖检查和安装
ping -c 2 www.baidu.com || exit 5
[ `echo "1 > 2"|bc` ] || yum install bc -y
sleep 3
[ `rpm -qa|grep dos2unix` ] || yum install dos2unix -y
sleep 3
- 先用
ping
命令检查网络连接。如果不能连接到www.baidu.com
,脚本将退出(返回状态码5)。 - 检查
bc
工具是否安装。如果未安装,将通过yum
安装它。 - 检查
dos2unix
是否安装,并安装它。
3. 监控变量定义
readonly times=$(date +%Y"/"%m"/"%d" "%k":"%M)
readonly machine=$(ip add | grep inet|grep -v 'inet6\|127.0.0.1'|awk '{ print $2 }' | sed 's/\/.*$//')
readonly names=$(hostname)
readonly cpuinfos=$(cat /proc/cpuinfo|grep processor|wc -l)
readonly onlines='2'
readonly cpuload='80'
readonly
声明了多个只读变量,用于存储当前时间、机器 IP、主机名、CPU 数量、在线用户数阈值和 CPU 负载阈值。
4. 在线用户检查
userd=$(top -n 1|grep users|awk -F '[, ]+' '{print $6}')
whos=$(who)
if [ $userd > $onlines ];then
echo "$times $machine 当前在线用户数: $whos"
fi
- 使用
top
命令获取当前在线用户数并与设定阈值比较,如果超过设定阈值,则输出当前在线用户信息。
5. 监控函数
top_check()
:获取 CPU 使用情况。load_time()
:获取 CPU 负载信息(1、5、15 分钟负载)。load_mem()
:获取内存和 swap 使用情况。echo_run()
,echo_cpu()
,echo_mem()
,echo_load()
:打印运行时间、CPU 使用情况、内存使用情况和 CPU 负载信息。
6. 监控结果处理与邮件发送
top_check
load_time
load_mem()
if [ `echo "$load1 > $cpuinfos"|bc` -eq 1 ];then
readonly runlog="/tmp/runs.log"
echo_run >$runlog
readonly loadlog="/tmp/load.log"
echo_load >$loadlog
readonly cpulog="/tmp/cpus.log"
echo_cpu >$cpulog
readonly memlog="/tmp/mems.log"
echo_mem >$memlog
dos2unix -k $runlog
dos2unix -k $loadlog
dos2unix -k $cpulog
dos2unix -k $memlog
mailx -s "服务器$names $machine" lumia98@vip.qq.com < $runlog
mailx -s "服务器$names $machine" lumia98@vip.qq.com < $loadlog
mailx -s "服务器$names $machine" lumia98@vip.qq.com < $cpulog
mailx -s "服务器$names $machine" lumia98@vip.qq.com < $memlog
fi
- 执行监控函数并生成日志文件,如果 1 分钟负载超过 CPU 数量,则将各项监控信息写入日志文件,并使用
mailx
命令发送邮件通知。
7. I/O 等待时间和磁盘空间检查
if [ `echo "$cpuwa > 60"|bc` -eq 1 ];then
readonly ioslogs="/tmp/wa.log"
iostat -cdx 3 > $ioslogs
dos2unix -k $ioslogs
mailx -s "服务器$names $machine的负载wa%" lumia98@vip.qq.com < $ioslogs
fi
disks=$(df | grep /dev|grep -v "shm\|boot\|devtmpfs"|awk '{print $5}'|sed 's/\%.*$//')
for x in $disks
do
if [ $x -gt 70 ]; then
disklog="/tmp/disk.log"
df -h >$disklog
dos2unix -k $disklog
mailx -s "服务器$names $machine" lumia98@vip.qq.com < $disklog
fi
done
- 如果 CPU 的 I/O 等待时间超过 60%,则记录信息并发送邮件。
- 检查各个磁盘的使用情况,若使用率超过 70%,则生成磁盘使用日志并发送邮件。
总结
该脚本主要用于监控服务器的性能和资源使用情况,及时发送通知以防止资源耗尽。它使用了 top
、iostat
和 df
等命令来获取系统状态,并通过 mailx
发送报告邮件。为了保证脚本的稳定性,它还进行了环境依赖的检查和安装。