需求
服务器运行时,最好能自动监控磁盘的剩余使用量,如果小于一定的值,就发报警提醒到运维工程师
磁盘检查命令
我们平时登录Linux后,查看磁盘状况的命令是df
# df -h 以G为单位显示整个磁盘使用情况,可以看到Filesystem我这边有两块硬盘(/dev/vda1,/dev/vdb1)Avail下显示的就是剩余的空间 [root@ecs-587c opt]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 486M 0 486M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 38M 458M 8% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda1 40G 3.7G 34G 10% / tmpfs 100M 0 100M 0% /run/user/0 /dev/vdb1 12G 309M 11G 3% /storage
但是如果要写成脚本,让脚本判断剩余磁盘空间,那上面的输出有点太多了,而且以字节显示为好(以字节显示比较好办,直接df就可以了)
使用df -k /path 可以输出/path所在的硬盘的磁盘空间,这样又可以减少一部分不需要的信息
我以我这边/storage是挂载的另一个硬盘(/dev/vdb1)为例,我查看/dev/vdb1 的空间:
# 查看/storage所在硬盘的磁盘使用情况,以字节为单位 [root@ecs-587c storage]# df -k /storage/ Filesystem 1K-blocks Used Available Use% Mounted on /dev/vdb1 12318856 315932 11357448 3% /storage # 查看/storage所在硬盘的磁盘使用情况,以GB为单位 [root@ecs-587c /]# df -k -h /storage/ Filesystem Size Used Avail Use% Mounted on /dev/vdb1 12G 309M 11G 3% /storage
不过我们还是希望只需要将Available剩余空间作为变量输出就可以了,可以这样做:
# 输出当前路径的磁盘剩余量(字节为单位) [root@ecs-587c storage]# df --output=avail -k "$PWD" | sed '1d;s/[^0-9]//g' 11357448 # 也可以这样写 [root@ecs-587c storage]# df -k --output=avail "$PWD" | tail -n1 11357448 # 输出指定路径的磁盘剩余量(字节为单位) [root@ecs-587c storage]# df --output=avail -k /storage | sed '1d;s/[^0-9]//g' 11357448 # 输出指定路径的磁盘剩余量(GB为单位) [root@ecs-587c storage]# df --output=avail -k -h /storage | sed '1d;s/[^0-9]//g' 11
检查脚本实现
有了以上的测试,我们可以写出检查磁盘剩余空间的脚本了,如下(checkDiskSpace.sh):
#!/bin/bash # ----------------------------------------------------------------------------------------- # 检查磁盘可用空间是否达到报警值,并发送提醒 # ----------------------------------------------------------------------------------------- # 排程(每隔2小时的12分,检查): 12 */2 * * * /path/to/checkDiskSpace.sh CHECK_PATH=/storage # 需要检查磁盘的PATH declare -i THRESHOLD_IN_GB=52 # 需要报警的阈值 THRESHOLD=$(( THRESHOLD_IN_GB*1024*1024 )) #echo "$THRESHOLD" FREE=`df -k --output=avail "$CHECK_PATH" | tail -n1` if [[ $FREE -lt $THRESHOLD ]]; then echo "$CHECK_PATH less than $THRESHOLD_IN_GB GB, please check!!!" # 你可以使用你的方式,发送提醒给自己,例如钉钉提醒 fi;
然后crontab写个排程就可以啦。Linux下排程的文章,详见:https://blog.terrynow.com/2021/05/24/linux-crontab-scheduled-tasks-intro-example-and-notes/
文章评论