Linux系统监控脚本编写实战:从零到定时任务
准备工作:环境与工具
开始编写Linux系统监控脚本前,先确认你的服务器环境。
你需要一台安装CentOS 7/8、Ubuntu 20.04或更高版本的Linux机器,使用普通用户(非root)登录,但脚本执行时需要sudo权限。
基础工具如bash、awk、grep、free、df、mpstat等通常系统自带,若缺少mpstat,可执行sudo apt install sysstat(Debian系)或sudo yum install sysstat(RHEL系)。
推荐在/home/你的用户名/scripts目录下创建脚本文件。
第一步:编写CPU与内存监控部分
我们从一个最精简的监控脚本开始,它能采集CPU使用率和内存占用百分比。
创建一个文件monitor.sh:
#!/bin/bash
# 获取CPU使用率(取空闲百分比后计算)
idle=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}')
cpu_usage=$(echo "100 - $idle" | bc)
# 获取内存使用率(Used / Total * 100)
mem_total=$(free -m | awk 'NR==2{print $2}')
mem_used=$(free -m | awk 'NR==2{print $3}')
mem_usage=$(echo "scale=2; $mem_used * 100 / $mem_total" | bc)
echo "CPU使用率: $cpu_usage%"
echo "内存使用率: $mem_usage%"
top -bn1一次性输出当前CPU信息,grep "Cpu(s)"定位行,awk '{print $8}'提取空闲列。bc是计算器工具,scale=2保留两位小数。free -m以MB显示内存,第二行Total和Used字段。
授执行权限:chmod +x monitor.sh,然后运行 ./monitor.sh 验证输出。
如果报错“bc: command not found”,安装 sudo apt install bc 即可。
第二步:扩展磁盘与网络监控
在脚本中追加磁盘使用率和网络流量统计。
磁盘统计用 df -h /,网络可用 /sys/class/net/eth0/statistics/(替换你的网卡名,如eth0或ens33)。
# 磁盘使用率(根分区)
disk_usage=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
echo "根分区磁盘使用率: $disk_usage%"
# 网卡入站流量(单位字节)
if [ -f /sys/class/net/eth0/statistics/rx_bytes ]; then
rx_bytes=$(cat /sys/class/net/eth0/statistics/rx_bytes)
tx_bytes=$(cat /sys/class/net/eth0/statistics/tx_bytes)
echo "入站流量: $rx_bytes 字节"
echo "出站流量: $tx_bytes 字节"
else
echo "未找到eth0网卡,请检查网卡名称"
fi
注意:网卡名可在终端输入 ip link show 或 ifconfig 确认。
如果你使用不同网卡,替换脚本中的eth0即可。
第三步:添加日志与定时任务
单纯的输出不够实用,我们需要把结果写入日志文件,并用cron定时执行。
在脚本开头定义日志路径,追加时间戳:
LOG_FILE="/var/log/system_monitor.log"
echo "$(date '+%Y-%m-%d %H:%M:%S') 监控开始" >> $LOG_FILE
# 原有采集代码后追加输出到日志
{
echo "CPU使用率: $cpu_usage%"
echo "内存使用率: $mem_usage%"
echo "根分区磁盘使用率: $disk_usage%"
echo "入站流量: $rx_bytes 字节"
echo "出站流量: $tx_bytes 字节"
echo "-------------------------"
} >> $LOG_FILE
注意日志目录权限:如果使用/var/log,需要sudo权限。
可将脚本放在/usr/local/bin/并设置属主。
设置cron定时任务:运行 crontab -e,添加一行每5分钟执行一次:
*/5 * * * * /home/你的用户名/scripts/monitor.sh
保存后cron会自动启用。
查看日志:tail -f /var/log/system_monitor.log 观察是否每5分钟有新增记录。
避坑指南与高频问题解答
问题1:脚本执行报错 “Permission denied”
原因:没有可执行权限或日志目录无写权限。解决:chmod +x 脚本路径,并将日志路径改为自己有权限的目录,如~/monitor.log。
问题2:bc未安装导致浮点运算失败
解决:sudo apt install bc 或 sudo yum install bc。
问题3:cron任务不执行
检查:1)脚本中是否使用绝对路径(如/usr/bin/awk而非awk);2)cron的环境变量有限,建议在脚本开头导入 export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin。
问题4:网卡名称不对
使用 ip link show 查看实际名称,如ens33、enp0s3等,修改脚本中对应的文件名。
效果验证建议
手动执行脚本:./monitor.sh 观察输出是否正常。
然后等待cron触发,查看日志文件内容。
也可以使用 journalctl -u cron 查看cron的日志(部分系统)。
如果你看到类似“CPU使用率: 15.2%”这样的持续记录,说明监控脚本已正常工作。
后续可基于此模板扩展告警功能(如CPU超过80%发送邮件)。