Мониторинг свободного места на диске в линуксе
Таких статей полно в Сети, но моя — особенная.
Нюанс в том, что обычные скрипты не борятся с переносом строки в выводе команды 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