Home  >  Article  >  Operation and Maintenance  >  Shell programming practice monitoring disk partition usage

Shell programming practice monitoring disk partition usage

齐天大圣
齐天大圣Original
2020-09-20 10:55:451673browse

不知道大家有没有碰到过磁盘分区写满,导致新数据写入不了,造成网站出现了问题。之前自己有几次碰到过这种情况,自己当时紧急解决办法是:删除网站的日志文件,删除了MySQL的binlog日志。

当然我们是不希望发生此类问题的,如果网站总出现不稳定或打不开情况,会给用户一种不靠谱的感觉。所以,对于磁盘分区的使用,我们需要实时监控,当超过预设值时,就发送份邮件或短信给管理员,将错误扼杀至摇篮里。

对于此脚本的编写是很简单的,主要一点就是获取到磁盘分区的使用率。我们知道df命令可以列出各个分区的空间使用情况:

# df 
Filesystem     1K-blocks     Used Available Use% Mounted on
devtmpfs         3986648        0   3986648   0% /dev
tmpfs            3999984        0   3999984   0% /dev/shm
tmpfs            3999984      528   3999456   1% /run
tmpfs            3999984        0   3999984   0% /sys/fs/cgroup
/dev/vda1       41931756 17576208  24355548  42% /
/dev/vdb1       52403200   476572  51926628   1% /data
/dev/vdb2      104806400 29255772  75550628  28% /www
tmpfs             799996        0    799996   0% /run/user/0
/dev/vdb3       52402180   398576  52003604   1% /mnt

我们可以看到各个分区的空间使用情况。然后接口grep命令以及awk命令,过滤掉其他信息,只留下各个分区的使用情况信息。

我们只想得到以/dev/开头的分区信息

# df | grep ^/dev
/dev/vda1       41931756 17576264  24355492  42% /
/dev/vdb1       52403200   476572  51926628   1% /data
/dev/vdb2      104806400 29255980  75550420  28% /www
/dev/vdb3       52402180   398576  52003604   1% /mnt

然后继续使用awk命令过滤不想要的信息

# df | grep ^/dev | awk '{print $1":"$5}'
/dev/vda1:42%
/dev/vdb1:1%
/dev/vdb2:28%
/dev/vdb3:1%

拿到各个分区的使用率后,下面就是对其进行循环遍历,依次判断各个分区的使用情况。

下面给出完成的代码:

#!/bin/bash
# 监控分区的空间使用情况,超过预设值告警
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:~/bin
export LANG=en

# 分区空间使用率阀值
USE_LIM=70
while ((1))
do
    disks=$( df | grep ^/dev | awk '{print $1":"$5}')
    for disk in $disks
    do
        used=$(echo $disk | cut -d: -f2 | cut -d'%' -f1)
        
        if [ "$used" -ge "$USE_LIM" ];then
            # 调用告警脚本,这里直接用echo来替代了
            echo "$(echo $disk | cut -d: -f1) is used $used%"
        fi
    done
    
    sleep 10
done

注意:一般我们服务器上用的语系都是英文的,特别是在编写shell脚本的时候,建议加上这样一行

export LANG=en

因为我们是要做实时的监控,所以脚本里使用了死循环,表示此脚本不会停会一直循环执行。当然,执行速度也是要做限制的,不然占用太多服务器资源就不太好了。所以这里使用了sleep 10,表示10秒监控一次。

另外这里还要一点需要注意,就是过滤掉百分号%。这里我们使用了cut命令来过滤掉%,然后拿到纯数字型的分区使用率和预设值做比较。

The above is the detailed content of Shell programming practice monitoring disk partition usage. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn