Как мониторить свободное место на диске VDS скриптом?

Поддержание достаточного свободного места на диске вашего VDS – критически важная задача для обеспечения стабильной работы сервисов и предотвращения сбоев. В этой статье мы рассмотрим, как создать и настроить скрипты для мониторинга свободного места на диске вашего VDS, чтобы вы могли оперативно реагировать на возникающие проблемы. Мы охватим различные подходы, от простых bash-скриптов до более сложных решений с использованием Python и отправкой уведомлений.

Содержание:

Мониторинг с помощью Bash и команды df

Самый простой и быстрый способ мониторинга свободного места на диске – использование команды df в bash-скрипте. df (disk free) выводит информацию об использовании дискового пространства файловых систем. Мы можем использовать ее в сочетании с другими командами, чтобы получить конкретные данные и настроить оповещения.

Пример 1: Простой скрипт для проверки свободного места

#!/bin/bash

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в процентах (например, 10%)
THRESHOLD=10

# Получаем процент использования диска
USAGE=$(df -h "$DISK" | awk 'NR==2{print $5}' | tr -d '%')

# Проверяем, превышен ли порог
if [ "$USAGE" -gt $(expr 100 - $THRESHOLD) ]; then
  echo "Внимание! На диске $DISK осталось менее $THRESHOLD% свободного места."
fi

Этот скрипт выполняет следующие действия:

  • Определяет раздел диска для мониторинга (DISK="/").
  • Устанавливает пороговое значение свободного места в процентах (THRESHOLD=10).
  • Использует df -h "$DISK" для получения информации об использовании диска в удобном для чтения формате.
  • С помощью awk 'NR==2{print $5}' извлекает процент использования диска из второй строки вывода df (где находится информация о разделе).
  • tr -d '%' удаляет символ процента из полученной строки.
  • Сравнивает процент использования с пороговым значением. Если процент использования превышает 100 - $THRESHOLD, выводит предупреждение.

Пример 2: Более детальный скрипт с выводом информации о свободном месте в гигабайтах

#!/bin/bash

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в гигабайтах
THRESHOLD=5

# Получаем свободное место в гигабайтах
FREE_GB=$(df -h "$DISK" | awk 'NR==2{print $4}')

# Убираем букву 'G' из значения
FREE_GB_NUM=$(echo "$FREE_GB" | sed 's/G//')

# Проверяем, меньше ли свободное место порогового значения
if (( $(echo "$FREE_GB_NUM > $THRESHOLD" | bc -l) )); then
  echo "Внимание! На диске $DISK осталось менее $THRESHOLD ГБ свободного места.  Сейчас свободно: $FREE_GB"
fi

Этот скрипт делает то же самое, но использует гигабайты вместо процентов, что может быть более наглядным:

  • Получает свободное место в гигабайтах с помощью df -h "$DISK" | awk 'NR==2{print $4}'.
  • Удаляет букву ‘G’ из полученного значения с помощью sed 's/G//'.
  • Использует bc -l для сравнения чисел с плавающей точкой, так как df -h может выводить значения с десятичной точкой.
  • Выводит предупреждение, если свободное место меньше порогового значения.

Пример 3: Мониторинг нескольких разделов диска

#!/bin/bash

# Разделы диска для мониторинга
DISKS=("/")

# Пороговое значение свободного места в процентах
THRESHOLD=10

# Перебираем разделы диска
for DISK in ${DISKS[@]}; do
  # Получаем процент использования диска
  USAGE=$(df -h "$DISK" | awk 'NR==2{print $5}' | tr -d '%')

  # Проверяем, превышен ли порог
  if [ "$USAGE" -gt $(expr 100 - $THRESHOLD) ]; then
    echo "Внимание! На диске $DISK осталось менее $THRESHOLD% свободного места."
  fi
done

В этом примере скрипт перебирает несколько разделов диска, указанных в массиве DISKS, и выполняет проверку для каждого из них.

Чтобы автоматизировать выполнение скрипта, добавьте его в cron. Например, для запуска скрипта каждые 5 минут, добавьте следующую строку в crontab:

*/5 * * * * /path/to/your/script.sh

Замените /path/to/your/script.sh на фактический путь к вашему скрипту.

Совет эксперта: Не забывайте добавлять логирование в ваши скрипты мониторинга. Это поможет вам отслеживать историю изменений и выявлять долгосрочные тенденции в использовании дискового пространства.

Иван Петров, Системный администратор

Мониторинг с помощью Python и библиотеки psutil

Python предоставляет более гибкий и мощный подход к мониторингу дискового пространства, особенно с использованием библиотеки psutil (process and system utilities). psutil позволяет получать информацию о системе, включая использование диска, в удобном для обработки формате.

Пример 1: Простой скрипт Python для проверки свободного места

import psutil

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в процентах
THRESHOLD = 10

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем процент использования диска
usage_percent = disk_usage.percent

# Проверяем, превышен ли порог
if usage_percent > (100 - THRESHOLD):
    print(f"Внимание! На диске {DISK} осталось менее {THRESHOLD}% свободного места.  Использовано: {usage_percent}%")

Этот скрипт выполняет следующие действия:

  • Импортирует библиотеку psutil.
  • Определяет раздел диска для мониторинга (DISK="/").
  • Устанавливает пороговое значение свободного места в процентах (THRESHOLD = 10).
  • Использует psutil.disk_usage(DISK) для получения информации об использовании диска.
  • Извлекает процент использования диска из объекта disk_usage.
  • Сравнивает процент использования с пороговым значением и выводит предупреждение, если порог превышен.

Пример 2: Скрипт Python с выводом информации о свободном месте в гигабайтах

import psutil

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в гигабайтах
THRESHOLD = 5

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем свободное место в гигабайтах
free_gb = disk_usage.free / (230)  # Convert bytes to GB

# Проверяем, меньше ли свободное место порогового значения
if free_gb < THRESHOLD:
    print(f"Внимание! На диске {DISK} осталось менее {THRESHOLD} ГБ свободного места.  Свободно: {free_gb:.2f} ГБ")

Этот скрипт показывает, как получить и вывести свободное место в гигабайтах. Обратите внимание на преобразование байтов в гигабайты (free_gb = disk_usage.free / (230)) и форматирование вывода для отображения двух знаков после запятой ({free_gb:.2f}).

Пример 3: Мониторинг нескольких разделов диска с помощью Python

import psutil

# Разделы диска для мониторинга
DISKS = ["/", "/home"]

# Пороговое значение свободного места в процентах
THRESHOLD = 10

# Перебираем разделы диска
for DISK in DISKS:
    try:
        # Получаем информацию об использовании диска
        disk_usage = psutil.disk_usage(DISK)

        # Получаем процент использования диска
        usage_percent = disk_usage.percent

        # Проверяем, превышен ли порог
        if usage_percent > (100 - THRESHOLD):
            print(f"Внимание! На диске {DISK} осталось менее {THRESHOLD}% свободного места. Использовано: {usage_percent}%")
    except FileNotFoundError:
        print(f"Раздел диска {DISK} не найден.")

В этом примере скрипт перебирает список разделов диска и выполняет проверку для каждого из них. Обратите внимание на блок try...except, который обрабатывает случай, когда раздел диска не найден.

Для запуска Python-скрипта также можно использовать cron. Например, для запуска скрипта каждые 5 минут, добавьте следующую строку в crontab:

*/5 * * * * /usr/bin/python3 /path/to/your/script.py

Замените /usr/bin/python3 на путь к вашему интерпретатору Python, а /path/to/your/script.py на фактический путь к вашему скрипту.

ФункцияОписание
psutil.disk_usage(path)Возвращает объект с информацией об использовании диска для указанного пути.
disk_usage.totalОбщий размер раздела диска в байтах.
disk_usage.usedИспользованное пространство на диске в байтах.
disk_usage.freeСвободное пространство на диске в байтах.
disk_usage.percentПроцент использования диска.

Настройка отправки уведомлений по электронной почте

Чтобы оперативно реагировать на проблемы с дисковым пространством, необходимо настроить отправку уведомлений по электронной почте. Мы можем добавить эту функциональность в наши скрипты, используя различные инструменты и библиотеки.

Пример 1: Отправка уведомлений по электронной почте с помощью команды mail (bash)

#!/bin/bash

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в процентах
THRESHOLD=10

# Получаем процент использования диска
USAGE=$(df -h "$DISK" | awk 'NR==2{print $5}' | tr -d '%')

# Проверяем, превышен ли порог
if [ "$USAGE" -gt $(expr 100 - $THRESHOLD) ]; then
  SUBJECT="Внимание! Мало места на диске $DISK"
  BODY="На диске $DISK осталось менее $THRESHOLD% свободного места. Использовано: $USAGE%"
  echo "$BODY" | mail -s "$SUBJECT" your_email@example.com
fi

Этот скрипт отправляет электронное письмо с помощью команды mail, если порог использования диска превышен. Замените your_email@example.com на ваш адрес электронной почты.

Примечание: Для использования команды mail на вашем VDS может потребоваться установка и настройка почтового сервера (например, Postfix). Если почтовый сервер не настроен, отправка писем может не работать.

Пример 2: Отправка уведомлений по электронной почте с помощью библиотеки smtplib (Python)

import psutil
import smtplib
from email.mime.text import MIMEText

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в процентах
THRESHOLD = 10

# Ваш адрес электронной почты и пароль
SENDER_EMAIL = "your_email@example.com"
SENDER_PASSWORD = "your_password"

# Адрес электронной почты получателя
RECEIVER_EMAIL = "recipient_email@example.com"

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем процент использования диска
usage_percent = disk_usage.percent

# Проверяем, превышен ли порог
if usage_percent > (100 - THRESHOLD):
    SUBJECT = f"Внимание! Мало места на диске {DISK}"
    BODY = f"На диске {DISK} осталось менее {THRESHOLD}% свободного места. Использовано: {usage_percent}%"

    # Создаем MIME-объект
    msg = MIMEText(BODY)
    msg['Subject'] = SUBJECT
    msg['From'] = SENDER_EMAIL
    msg['To'] = RECEIVER_EMAIL

    # Отправляем письмо
    try:
        with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
            smtp.login(SENDER_EMAIL, SENDER_PASSWORD)
            smtp.send_message(msg)
        print("Письмо успешно отправлено!")
    except Exception as e:
        print(f"Ошибка при отправке письма: {e}")

Этот скрипт отправляет электронное письмо с помощью библиотеки smtplib. Замените your_email@example.com, your_password и recipient_email@example.com на ваши учетные данные и адрес получателя. В этом примере используется SMTP-сервер Gmail. Вам может потребоваться включить «доступ для ненадежных приложений» в настройках вашей учетной записи Google.

Важно: Хранение паролей в скриптах небезопасно. Рассмотрите использование переменных окружения или других более безопасных способов хранения учетных данных.

Пример 3: Отправка уведомлений через Telegram Bot (Python)

import psutil
import telegram

# Раздел диска для мониторинга
DISK="/"

# Пороговое значение свободного места в процентах
THRESHOLD = 10

# Токен вашего Telegram бота
TELEGRAM_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"

# ID вашего Telegram чата
TELEGRAM_CHAT_ID = "YOUR_TELEGRAM_CHAT_ID"

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем процент использования диска
usage_percent = disk_usage.percent

# Проверяем, превышен ли порог
if usage_percent > (100 - THRESHOLD):
    MESSAGE = f"Внимание! На диске {DISK} осталось менее {THRESHOLD}% свободного места. Использовано: {usage_percent}%"

    # Отправляем сообщение через Telegram bot
    try:
        bot = telegram.Bot(token=TELEGRAM_TOKEN)
        bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=MESSAGE)
        print("Сообщение успешно отправлено в Telegram!")
    except Exception as e:
        print(f"Ошибка при отправке сообщения в Telegram: {e}")

Этот скрипт отправляет уведомление через Telegram bot. Вам потребуется создать Telegram bot и получить его токен, а также узнать ID вашего чата. Замените YOUR_TELEGRAM_BOT_TOKEN и YOUR_TELEGRAM_CHAT_ID на ваши значения.

Расширенные возможности мониторинга и логирования

Для более эффективного мониторинга дискового пространства, рекомендуется использовать расширенные возможности, такие как логирование, анализ исторических данных и интеграцию с системами мониторинга.

Пример 1: Логирование использования дискового пространства (Python)

import psutil
import datetime
import logging

# Настройка логирования
logging.basicConfig(filename="/var/log/disk_space.log", level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')

# Раздел диска для мониторинга
DISK="/"

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем процент использования диска
usage_percent = disk_usage.percent

# Логируем информацию
logging.info(f"Использование диска {DISK}: {usage_percent}%")

# Проверяем, превышен ли порог (опционально, можно логировать только при превышении порога)
THRESHOLD = 90
if usage_percent > THRESHOLD:
    logging.warning(f"Внимание! На диске {DISK} использовано более {THRESHOLD}% места: {usage_percent}%")

Этот скрипт добавляет логирование использования дискового пространства в файл /var/log/disk_space.log. Он записывает информацию об использовании диска при каждом запуске. Также, если использование диска превышает заданный порог (в данном случае 90%), записывается предупреждение.

Пример 2: Отправка данных в систему мониторинга (например, Zabbix) (Python)

import psutil
import subprocess

# Раздел диска для мониторинга
DISK="/"

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем процент использования диска
usage_percent = disk_usage.percent

# Отправляем данные в Zabbix с помощью zabbix_sender
zabbix_server = "your_zabbix_server"
zabbix_host = "your_zabbix_host"
zabbix_key = "disk.usage.percent"

command = f"zabbix_sender -z {zabbix_server} -s {zabbix_host} -k {zabbix_key} -o {usage_percent}"
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()

if process.returncode == 0:
    print(f"Данные успешно отправлены в Zabbix: {stdout.decode()}")
else:
    print(f"Ошибка при отправке данных в Zabbix: {stderr.decode()}")

Этот скрипт отправляет процент использования диска в систему мониторинга Zabbix с помощью утилиты zabbix_sender. Замените your_zabbix_server, your_zabbix_host и disk.usage.percent на соответствующие значения для вашей системы Zabbix. Необходимо, чтобы zabbix_sender был установлен и настроен на вашем VDS.

Пример 3: Анализ исторических данных с помощью Grafana и InfluxDB

Для анализа исторических данных об использовании дискового пространства можно использовать комбинацию InfluxDB (для хранения данных) и Grafana (для визуализации). Сначала необходимо настроить InfluxDB и Grafana. Затем можно изменить скрипт мониторинга, чтобы записывать данные в InfluxDB. Пример (Python):

import psutil
from influxdb import InfluxDBClient

# Раздел диска для мониторинга
DISK="/"

# Параметры InfluxDB
INFLUXDB_HOST = "your_influxdb_host"
INFLUXDB_PORT = 8086
INFLUXDB_DATABASE = "disk_monitoring"

# Получаем информацию об использовании диска
disk_usage = psutil.disk_usage(DISK)

# Получаем процент использования диска
usage_percent = disk_usage.percent

# Создаем клиент InfluxDB
client = InfluxDBClient(host=INFLUXDB_HOST, port=INFLUXDB_PORT, database=INFLUXDB_DATABASE)

# Формируем данные для записи
data = [
    {
        "measurement": "disk_usage",
        "tags": {
            "disk": DISK
        },
        "fields": {
            "usage_percent": usage_percent
        }
    }
]

# Записываем данные в InfluxDB
try:
    client.write_points(data)
    print("Данные успешно записаны в InfluxDB")
except Exception as e:
    print(f"Ошибка при записи данных в InfluxDB: {e}")

Этот скрипт записывает процент использования диска в базу данных InfluxDB. Замените your_influxdb_host и disk_monitoring на соответствующие значения для вашей системы InfluxDB. После этого вы можете создать дашборд в Grafana для визуализации этих данных.

Эти примеры показывают, как можно расширить базовый мониторинг дискового пространства, чтобы получить более полную картину и автоматизировать реагирование на проблемы.