Linux 下要用 Shell Script 自动检查硬盘分割区的使用量, 可以透过 df 指令实现。 df 指令可以在 Linux 下检视硬盘分割区使用量, 配合 grep 及 awk 撷取所需的资讯, 便可以用 Shell Script 自动检查硬盘使用量, 当发现使用量超过设定的百分比 (例如 80%) 时, 再用 mail 指令发出电子邮件通知系统管理员。
执行 “df -h” 时会得出类似以下结果:
|
1 2 3 4 5 6 7 8 |
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 25G 3.8G 20G 17% / devtmpfs 486M 0 486M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 51M 446M 11% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup tmpfs 100M 0 100M 0% /run/user/1000 |
可以看到有些资讯是不需要的, 那便用 grep 过滤掉不需要的行, 例如有 “Filesystem” 及 “tmpfs” 字串的行:
|
1 2 |
$ df -h | grep -vE '^Filesystem|tmpfs' /dev/sda 25G 3.8G 20G 17% / |
这时可以再加上 awk, 只把第 1 栏及第 5 栏的资料撷取, 即 /dev/sda 及 17% 的内容:
|
1 2 |
$ df -h | grep -vE '^Filesystem|tmpfs' | awk '{ print $1 " " $5 }' /dev/sda 17% |
现在轮到 Shell Script 的部份, 建立以下 Shell Script:
$ vim mon-disk.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 |
#!/bin/sh ### admin email ADMIN="you@email.com" ### alert percent (%) ALERT=80 ### partions don't want monitoring, use "|" separate multi partitions ### e.g. "/dev/cdrom|dev/sdb1" EXCLUDE_LIST="" if [ "$EXCLUDE_LIST" != "" ] ; then EXCLUDE_LIST="|$EXCLUDE_LIST" fi df -h | grep -vE "^Filesystem|tmpfs${EXCLUDE_LIST}" | awk '{ print $1 " " $5 }' | while read output; do usep=$(echo $output | awk '{ print $2}' | cut -d'%' -f1 ) partition=$(echo $output | awk '{ print $1 }' ) if [ $usep -ge "$ALERT" ]; then #echo "$partition $usep%" echo "$(hostname) out of space \"$partition ($usep%)\" on $(date)" | mail -s "Alert: Almost out of disk space $usep%" "$ADMIN" fi done |
其中有 3 个变量可以按需要修改:
ADMIN: 当硬盘分割区超过指定的使用量后, 发送到的电邮地址.
ALERT: 当硬盘分割区超过这个百分比时, 才会发送电邮.
EXCLUDE_LIST: 不用检查的分割区.
完成后设定可执行权限, 以下假设上面 Shell Script 储存在 /root/mon-disk.sh:
$ chmod +x /root/mon-disk.sh
最后设定 crontab 排程自动执行:
$ crontab -e
加入以下内容, 以下是每天 02:00 执行:
0 2 * * * /root/mon-disk.sh
你好
请问能发送mail 本身机器上要额外设定什么吗?或是mail server上要设定什么?
如果是用gmail可以吗?
因为lab上ping mail server & telnet domain 25都有通