Как мониторить свободное место на диске VDS скриптом?
Поддержание достаточного свободного места на диске вашего VDS – критически важная задача для обеспечения стабильной работы сервисов и предотвращения сбоев. В этой статье мы рассмотрим, как создать и настроить скрипты для мониторинга свободного места на диске вашего VDS, чтобы вы могли оперативно реагировать на возникающие проблемы. Мы охватим различные подходы, от простых bash-скриптов до более сложных решений с использованием Python и отправкой уведомлений.
Содержание:
- Мониторинг с помощью Bash и команды df
- Мониторинг с помощью Python и библиотеки psutil
- Настройка отправки уведомлений по электронной почте
- Расширенные возможности мониторинга и логирования
Мониторинг с помощью 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 для визуализации этих данных.
Эти примеры показывают, как можно расширить базовый мониторинг дискового пространства, чтобы получить более полную картину и автоматизировать реагирование на проблемы.