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都有通