Мониторинг свободного места на диске в линуксе

Мониторинг свободного места на диске в линуксе

Таких статей полно в Сети, но моя — особенная.

Нюанс в том, что обычные скрипты не борятся с переносом строки в выводе команды df
А с распространением виртуальных серверов эта ситуация начинает встречаться чаще.

Чтобы было нагляднее покажу картинку:


df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_main-root_lv
                      337G  157G  163G  49% /
tmpfs                 3,9G  4,0K  3,9G   1% /dev/shm
/dev/md0              3,9G   84M  3,6G   3% /boot

Таким образом, если мы хотим вывести наименование раздела, сколько осталось свободного места в гигабайтах и сколько — в %, то команда

df -h | awk '{print $1 " " $4 " " $5 }'

нам не поможет, потому что выведет она следующее:


Filesystem Avail Use%
/dev/mapper/vg_main-root_lv  
337G 49% /
tmpfs 3,9G 1%
/dev/md0 3,6G 3%

Как видим, после первого раздела из-за его длины происходит перенос строки и все данные относительно занимаемого им дискового пространства оказываются на следующей строке, при этом нарушается нумерация переменных.
В моём случае меня интересовал именно этот раздел, так что я мог перенумеровать переменные для получения данных именно о нём и на этом успокоиться, но хотелось решить проблему в общем случае.

Для чего был написан небольшой скриптик:


# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of linuxtuning.ru collection
# Visit https://linuxtuning.ru for more information
# ----------------------------------------------------------------------
# Linux shell script to watch disk space (should work on other UNIX oses )
# set admin email so that you can get email
# Thanks to @kreon for perl part
ADMIN=
# set alert level 90% is default
ALERT=91
df -h|perl -e '$a=0;@out=();while(){next unless $a++;chomp;push @out,grep { /.+/ }split(/\s+/);}for($i=0;$i<=$#out;$i+=6) { print join(" ", @out[$i..$i+5])."\n"; }' | awk '{print $5 " " $1 }' | while read output;
do
   usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
   partition=$(echo $output | awk '{ print $2 }' )
   if [ $usep -ge $ALERT ]; then
      echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" | 
mail -s "Alert: Almost out of disk space $usep" $ADMIN; 
	echo "Alert sent"; fi
done

Дальше ставим его в крон


*/10 * * * * /bin/bash ~/diskusage.sh >> diskusagetest.log

Для теста можно изменить значение ALERT чтобы проверить что скрипт срабатывает и почта отправляется.

Если же у вас такой проблемы (с переносом строк), то скрипт выглядит существенно проще:


#!/bin/bash
# This script is licensed under GNU GPL version 2.0 or above
# --------------------------------------------------------------------
# This script is part of linuxtuning.ru collection
# Visit https://linuxtuning.ru for more information
# --------------------------------------------------------------------
# Linux shell script to watch disk space (should work on other UNIX oses )
# set admin email so that you can get email
# Thanks to @kreon for perl part
ADMIN='mail@to'
# set alert level 90% is default
ALERT=91
df -h | grep -v Filesystem | while read output;
do
   usep=$(echo $output | awk '{ print $5}' | cut -d'%' -f1 )
   partition=$(echo $output | awk '{ print $1 " (" $6 ") " }' )
   if [ $usep -ge $ALERT ]; then
      echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
mail -s "Alert: Almost out of disk space $usep" $ADMIN;
        echo "$(date) Alert sent"; fi
done