Get Social

Bash скрипт в одну строку для проверки свободного места в Linux

Эта задача возникла после переноса сайтов клиента со старого 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” или может быть что-то другое)

Как мониторить mysql запросы

Иногда, нужно разобраться, какой запрос приходит из cms/cmf или другого скрипта на сервер Mysql.
Например, мне пришлось разбираться с библиотекой jqgrid-php. Было непонятно, какой запрос приходит на сервер mysql из скрипта.
Можно, конечно, поставить и настроить mysql-proxy, но ведь есть решение попроще:

1. Подключаемся от root к Mysql-серверу.

2. Устанавливаем куда писать лог:
set global general_log_file='/tmp/mysql_query.log';

3. Включаем лог
set global general_log = 1;

4. Выполняем свои скрипты

5. Выключаем, чтобы не засоряло сервер
set global general_log = 0;

6. Анализируем:
less /tmp/mysql_query.log

7. Всё!

Скрипт для мониторинга доменных имён

Скрипт для мониторинга доменных имён image

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

Поделюсь скриптом на Bash, который я набросал для этого. По сути – это парсер.
Что он делает, можно понять из комментариев, но всё же опишу немного подробнее:

Итак задача: скрипт, запускается по расписанию; опрашивает домены; отсылает отчёт на email.

[1] Откуда берём данные?

Скрипт использует для своей работы результаты команды whois. Иногда запрос в консоли: “whois какой-то-домен” не даёт ожидаемого результата. Это связано с тем, что команда whois не опрашивает подходящие сервера, которые содержат полную информацию. Поэтому мы можем добавить такие сервера в конфигурационный файл whois.conf

[2] Как это работает?

1. Видим массив из доменных имён, которые нужно проверять (заполнить самому).
2. Дальше – создаётся временный файл, который красиво наполняется парсером
3. Содержимое файла отправляется на почту и файл удаляется.

[3] Исходный код?

Вот он:

#!/bin/bash

## скрипт для мониторинга доменных имён -> проверка срока действия домена
## url: http://rocknroot.pp.ua/blog/skript-dlya-monitoringa-domennyih-imyon.html


# НЕ ЗАБЫТЬ ДОБАВИТЬ В /etc/whois.conf СТРОКИ:
# \.ua$ whois.com.ua
# \.by$ whois.cctld.by
#(если нужно)
# или положить где-нибудь свой whois.conf и указать параметром к команде whois

export LC_ALL=ru_RU.utf8

# массив доменных имён для опроса
ARR_DOMAIN+=(
ya.ru
mail.ru
)

# если нет возможности править whois.conf - тогда можно попробовать вписать в массив bash следующее значение: '-h whois.cctld.by tut.by' (в кавычках)

# создаём файл для временных данных
echo "" > tmp_file_domain_renew

# записывает туда заголовок таблицы 
printf "%-35s\t %-25s\t %-25s\n" "Domain     " "< 50 days" "> 50 days" >> tmp_file_domain_renew
printf "%-35s\t %-25s\t %-25s\n" "---------------" "----------" "----------" >> tmp_file_domain_renew

# парсим информацию о сроке действия домена
for DOMAIN_ in "${ARR_DOMAIN[@]}"
 do
 sleep 0.2
 dateexp_=`whois $DOMAIN_ | \
 egrep -i 'Expiration Date:|paid-till:|OK-UNTIL|Domain Currently Expires:|Record expires on|expires:|Registry Expiry Date:'| \
 head -n 1 | \
 sed 's/\(OK-UNTIL\) \(.\{,8\}\).*/\2/i' | \
 sed 's/.*Currently //' | \
 sed 's/.*Expiration Date:/ExpDate: /' | \
 sed 's/.*Registry Expiry Date:/RegExpDate: /' | \
 sed 's/T[0-9][0-9]\:.*//'| \
 awk '{$1=""; print $0}' | \
 sed 's/^\ //' | \
 sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1\2\3/i'`

#  высчитываем, сколько остаётся дней от текущей даты
dateexp_s=`date -d "${dateexp_}" +"%s"`
datenow_s=`date +"%s"`
diff_s=`expr $dateexp_s - $datenow_s`
diff_d=`expr $diff_s / 3600 / 24`

# заполняем стоблцы таблицы в зависимости от того
# больше или меньше, в данном случае, 50 дней
if [[ $diff_d -ge 50 ]];
then
  printf "%-35s\t %-25s\t %-25s\n" "$DOMAIN_"  "-" "$diff_d" >> tmp_file_domain_renew
else
  printf "%-35s\t %-25s\t %-25s\n" "$DOMAIN_" "$diff_d" "-" >> tmp_file_domain_renew
fi

done

# отсылаем на почту
# mail -s DomainRenewCheck mail@example.com < tmp_file_domain_renew

cat tmp_file_domain_renew

# прибираем за собой
rm tmp_file_domain_renew

[4] Проверка.

Не забываем сделать исполняемым с помощью команды:

chmod +x domain_renew.sh

Результат работы в почте должен быть примерно таким:

Домен                          < 50 дней             > 50 дней            
—————                     ———-                ———-               
ya.ru                               –                         320                      
mail.ru                             16                        –          

[5] Как добавить в планировщик?

Запускаем “crontab -e” в консоли и прописываем пусть к скрипту, время и дни, когда его нужно запускать.
Вот и всё. Теперь немного легче будет отследить, когда истекает срок домена. 🙂