Эта задача возникла после переноса сайтов клиента со старого VPS на новый. На новом виртуально сервере всё хорошо с процессором и озу, однако дискового пространства “впритык”. Получилось так, что Vesta CP, которая по-умолчанию создаёт 3 бэкапа, просто заполнила диск под ноль.
Клиент попросил, чтобы когда места становится мало – об этом сразу стало известно. Поэтому я решил сделать очень простой скрипт в одну строку, который отслеживает дисковое пространство и отправляет уведомление на электронную почту. Такой скрипт можно целиком прописать в планировщик Cron.
Собственно, вот он:
Скрипт мониторинга дискового пространства в Linux
if [ "`df | grep "/dev/sda1" | awk '{print $5}' | sed 's/\%//'`" -ge 95 ]; then echo "Disk usage exceeded 95%" | mail -s "Warning! My Server" mail@example.com; fi
При достижении использования диска на 95% этот однострочный скрипт начнёт присылать сообщения с предупреждениями на почту “mail@example.com”. Например, можно добавить эту строчку в крон, чтобы проверка была каждые 45 минут. Конечно, можно хоть каждую минуту поставить, но тогда ваш ящик просто завалит этими сообщениями.
Можно также пойти дальше и сделать, чтобы у нас был ещё одно предупреждение при достижении 99%:
if [ "`df | grep "/dev/sda1" | awk '{print $5}' | sed 's/\%//'`" -ge 99 ]; then echo "Disk usage exceeded 99%!" | mail -s "Panic!! My Server" mail@example.com; fi
Тут ситуация посерьёзнее, поэтому можно в кроне поставить, чтобы проверка была каждые 5 минут
В итоге получим в crontab:
# server usage alert
*/45 * * * * if [ "`df | grep "/dev/sda1" | awk '{print $5}' | sed 's/\%//'`" -ge 95 ]; then echo "Disk usage exceeded 95%" | mail -s "Warning! My Server" mail@example.com; fi
*/5 * * * * if [ "`df | grep "/dev/sda1" | awk '{print $5}' | sed 's/\%//'`" -ge 99 ]; then echo "Disk usage exceeded 99%!" | mail -s "Panic!! My Server" mail@example.com; fi
Конечно, можно пойти ещё дальше и сделать из этих скриптов 1 в отдельном файле и с красивым синтаксисом и отступами. Но описанный выше вариант просто работает и мне этого достаточно.
P.S. Убедитесь, что в выводе команды df у вас будет нужный диск (“/dev/sda1” или может быть что-то другое)