+7 707 858 58 37
help@vpsadm.ru
Как предотвратить сбой VPS и падение сайтов. Скрипт — автоматическая мониторилка дисков c уведомлением на email

Типичная ситуация — у вас есть VPS, на котором есть много чего. И вы так увлеклись развитием своих сайтов на нём, что дисковое пространство на сервере подходит к концу.

Важно не проебать этот момент, чтобы сайты не «упали». Проверить использование диска можно такой командой:

df -h

Это одна из первейших команд, которые даются как только я логинюсь на сервер. Она вообще на автомате из под пальцев вылетает, это просто как банальная проверка «пульса» сервера. Другая похожая проверка — ifconfig, ибо еще одна важнейшая система — сеть. Но мы про нее сейчас не будем.
check-disk-usage-on-linux-server
А вот о дисковом пространстве поговорим особо. Ибо диск это одно из сердец системы, от его состояния и скорости в значительной степени зависит производительность и вообще, работоспособность сервера. (А вот как проверить скорость диска на хостинге. Это, кстати, своеобразный тест хостера «на вшивость» — можно определить что хостер наёбывает (или нет) вас в предоставлении SSD, который сейчас в тренде)

Что будет если на сервере заполнен диск? Ошибка «No space left on device»

Потому как если диск на нём будет заполнен на 100% или близко к тому, весь софт работающий на нём как бы «замёрзнет». Он вроде и не выключится, но и работать нормально не сможет. Сайты возможно будут открываться, если у вас там стоит nginx, возможно будут открываться странички на чтение, но какой-то чуть более сложный функционал, типа тех же комментов, или даже логина — работать не будет. А в логи софт будет сыпать ошибку

 "no space left on device"

Как решить проблему если диск переполнился?

Её устранение сводится к тому, чтобы освободить место на диске. То есть удалить что нибудь ненужное. Чтобы удалить что-нибудь ненужное с диска, это ненужное надо для начала найти. Определять что тебе не нужно на сервере обычно приходится с помощью исследования размера файлов и папок. Для этого служит такая утилита du, которую можно использовать следующим образом:

du -sh /var/* 

Подсчитает и покажет объем всех папок (каждой в отдельности) внутри /var/:
check-sizes-of-all-dirs-inside-one-dir
Опция -s тут означает — считать полный объем папок, без нее будет выведен объем всех подпапок и файлов по отдельности. А опция -hhuman(readable) — означает выводить размер в «человекопонятном» формате, а не в килобайтах. Кстати, в предыдущей команде df -h она означает то же самое.

Как быстро найти большие файлы и папки и ненужные файлы для очистки диска

Но чтобы пользоваться du это нужен навык, который есть только у красноглазых. Прелесть du только в том, что он есть в любой системе по-умолчанию, не нужно ничего доустанавливать. А для мазёвых пацанов есть крутая утилитка ncdu, которая сама подсчитывает, да еще и выводит всё в интерактивном режиме, позволяет перемещаться по структуре папок, и даже производить с ними действия, например удаление, с помощью хоткеев. Но её нужно сначала установить:

apt-get install -y ncdu

Это вариант для deb-систем — любой версии debian, ubuntu или основанных на них других дистрибутивах, типа mint, и т. д.
А вот так для rpm-based систем — centos, rhel, fedora, etc.

yum install -y ncdu

Когда она установлена можно запускать:

ncdu /var/

И она выведет структуру подпапок в этой директории, с указанием их объёма:
use-ncdu-for-find-big-dirs-and-files
Например, чтобы снести папку, которую вы определили как ненужную и подлежащую очистке, нужно нажать кнопку d(elete) на клавиатуре. Будет выдано предупреждение, на которое можно ответить no или yes. Так же есть вариант — больше не спрашивать, если вы собрались устроить тотальную чистку и уверены, что не удалите что-то нужное.
ncdu-analyze-find-and-remove-files-for-freeing-disk

Что можно удалить на сервере чтобы быстро освободить диск?

Вот кстати папка /var/cache/apt — не зря здесь на скрине, это реально можно подчистить в любой deb-системе, если вам нужно срочно освободить диск, чтобы ваши сайты очнулись. А в centos (или любой другой rpm-based) можно подчищать /var/cache/yum/ — это тоже кэш пакетного менеджера, куда складываются пакеты — то есть дистрибутивы устанавливаемого и установленного на сервер софта.
Другой вариант смотреть папку /var/log на предмет больших файлов. Но за логи разговор отдельный, их просто так сносить нежелательно. Их лучше обнулять, иначе софт, который в данный момент запущен и должен в них писать — может зависнуть. Например веб-сервер apache или mysql. Более, того диск не освободится, если удалять файл, который открыт на чтение или запись каким-то работающим софтом. Ибо так устроена файловая система в линуксах (да и в не линуксах тоже) — чтобы этот файл физически удалился нужно перезапустить софт, чтобы тот «отпустил» файл. Кстати, как раз таки логи апача могут забить диск. Чтобы обнулить большой логфайл без риска подвесить вебсервер, нужно исполнить примерно вот такую конструкцию:

cat /dev/null > /var/log/apache2/my-very-cool-site.access.log

, где my-very-cool-site.access.log — это ваш самый большой логфайл. Они могут достигать нескольких Gb, а иногда даже десятков или сотен Gb.

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

Скрипт для мониторинга состояния жесткого диска и посылки уведомлений на email

Это как раз таки решение, которое позволит вам своевременно подчистить или расширить диск, до того как он забьётся. Бывают конечно ситуации когда забивается внезапно, тогда скрипт не сильно поможет, потому что вы можете даже не успеть среагировать — вчера было только 30% занято, а сегодня, буквально через несколько часов, что-то сожрало всё доступное дисковое пространство. Но такие случаи редки, и это уже издержки. А мы будем решать типичную ситуацию.

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

Но этот метод показал свою непригодность. Поэтому нашел на stackoverflow и немного допилил полноценный скрипт, который можно запустить в системе, и он будет по расписанию запускаться. При запуске он будет проверять состояние жестких дисков, подчитывать сколько процентов диска занято, и если это значение больше какого-то заданного порога — то присылать уведомление на e-mail.

В теме письма будет ip-адрес сервера, а в нем самом вывод команды df -h

Получился вот такой скрипт:

#!/bin/bash
#set -x
errortext=""
EMAILS="yourmail@site.com"

# get file system disk usage report for 
# all file systems (-a) 
# with POSIX output (P) 
# in human readable format (h)
# Look for only vgroup (I've LVM), but if you want only /home and /var 
# to be checked for, do something like this: egrep 'home|var'

for line in `df -aPh |grep '^/dev'| sort | awk '{print$6"-"$5"-"$4}'`
do

    # get the percent and chop off the %
    percent=`echo "$line" | awk -F - '{print$2}' | cut -d % -f 1`
    partition=`echo "$line" | awk -F - '{print$1}' | cut -d % -f 1`

    # Let's set the limit to 90% when alert should be sent
    limit=90

    if [ $percent -ge $limit ]; then
        errortext="$errortext $line"
    fi
done

# send an email
if [ -n "$errortext" ]; then
    echo "`df -h`" | mail -s "Disk alert on `ip -f inet addr| grep 'inet ' |grep -v '127.0.0'|awk '{ print $2}'|cut -d/ -f1 |head -n 1`"         $EMAILS
fi

Здесь есть два параметра, к подбору которых сводится настройка скрипта:
EMAILS — в нем вам нужно указать адрес своей почты, на которую вы хотите получать уведомления;
limit — тут вы указываете после заполнения диска на сколько процентов скрипт должен эти уведомления слать;

Тут стоит 90%, но не всегда такое значение имеет смысл. Ибо в случае c 1 tb диском это еще 100Gb, тогда вам возможно надо указать limit=97, чтобы скрипт начал слать уведомления когда остаётся 30Gb диска.

Вот так это выглядит
page_001_2016_11_21

Ну тело письма:
page_002_2016_11_21

Требования к системе для нормальной работы скрипта

Кроме того, у вас на сервере должна нормально работать почтовая подсистема. Должна быть утилита mail. В deb-системах она обычно есть по умолчанию, а вот в centos её может не быть. Тогда нужно доустановить:

yum install -y mailx

Ну, как правило, на серверах с почтой всё нормально, ибо ваши сайты тоже при отправке сообщений через php_mail используют системный механизм отправки почты.
Её проверка и настройка выходит за рамки нашей сегодняшней истории. Но всё же.

Просто закиньте скрипт на диск, и запустите его там. Если на почту ничего не приходит, то начинать стоит с исследования логов почты, которые лежат где-нибудь в /var/log/exim/main.log или в /var/log/maillog. А если вы хотите получать уведомления на gmail почту, то вам возможно нужно настроить SPF-запись с указанием своего IP для домена, с которого будет уходить почта. Так что если на gmail не приходит, то попробуйте другую почту, mail.ru например.

Вообще, почту я не люблю. Муторное это дело — разбираться со своим почтовым сервером. Поэтому и рекомендую настраивать её на внешних сервисах типа яндекса или biz.mail.ru. Но отправка через sendmail и php_mail на сервере должна быть в любом разе, поэтому скрипт скорей-всего у вас заработает без бубна.
Если что, пишите в комментах, разберёмся. У скрипта кстати есть режим отладки:
опция set -x.
Если хотите чтобы логгировалась его работа при запуске из крона, то нужно его там прописывать с перенаправлением вывода в лог:

0 9 * * * /bin/bash /root/chkdisk.sh > /root/chkdisk.log 2>&1

Как настроить запуск скрипта по расписанию

Ах да, крон. Это чудесная штука для автоматизации, которая будет запускать наш скрипт в указанное время. Опять же, принцип работы и использование крона выходит за рамки статьи, но для примера покажу.
Открываем расписание на редактирование:

crontab -e 

Добавляем сюда, в самый конец такую строчку:

0 */1 * * * /bin/bash /root/chkdisk.sh

Это значит что скрипт будет исполняться каждый час, в 0 минут. А вот в примере выше, где с отладкой, там указано выполнение раз в сутки, в 9:00 утра. Ну с этим уже самостоятельно разберётесь, это ж обычный cron.

Кстати, скрипт доступен по адресу https://vpsadm.ru/tools/chkdisk.sh . Возможно он ещё будет дорабатываться и обновляться, по этой ссылке всегда сможете найти актуальную версию, покуда работает мой сайт. Можно сразу скачать прямо на сервер:

wget https://vpsadm.ru/tools/chkdisk.sh

Что ещё можно автоматизировать скриптами?

Да абсолютно всё. Есть и серьёзные системы мониторинга, которые можно установить и заставить их следить за десятками и сотнями серверов — munin, zabbix, nagios. В такие системы обычно уже встроен функционал рассылки алертов. Или чуть проще — monit. А это же простецкий скрипт, без излишеств. Но подобное узкое и быстрое решение на коленке можно сваять для чего угодно. Для регулярной отсылки небольших бэкапов, например к вам прямо в почту. Или для парсинга и наполнения каких-нибудь сайтов по расписанию. А этот скрипт легко можно доработать для вывода и отсылки в почту любой информации о состояниях и событиях на серверах или сайтах.

Отправить ответ

Notify of
avatar
seoonly.ru
Гость

С письмом-уведомлением тема. Спасибо!

Юрий
Гость

Подскажи, из опыта, у ihc годные vps с ssd?
Сижу на их VPS БЕЗ ssd, LA шкалит порой (>5 когда роботы на кидываются), может ли это быть из за нагрузки на диск? И может ли переход на SSD улучшить ситуацию?

Ginger Dog
Гость

Годно, но я действую проще. Использую https://nodequery.com у них до 10 серверов бесплатно, если кончается память или место на диске или процессор загружен сильно, то присылают уведомления на почту

wpDiscuz