¿Cómo monitorizar el espacio libre en disco de un VDS con un script?
Mantener suficiente espacio libre en el disco de tu VDS es una tarea crítica para asegurar la estabilidad de los servicios y prevenir fallos. En este artículo, vamos a ver cómo crear y configurar scripts para monitorizar el espacio libre en disco de tu VDS, para que puedas reaccionar rápidamente ante los problemas que surjan. Cubriremos varios enfoques, desde scripts bash sencillos hasta soluciones más complejas usando Python y el envío de notificaciones.
Contenido:
- Monitorización con Bash y el comando df
- Monitorización con Python y la biblioteca psutil
- Configuración del envío de notificaciones por correo electrónico
- Opciones avanzadas de monitorización y registro
Monitorización con Bash y el comando df
La forma más sencilla y rápida de monitorizar el espacio libre en disco es usar el comando df en un script bash. df (disk free) muestra información sobre el uso del espacio en disco de los sistemas de archivos. Podemos usarlo junto con otros comandos para obtener datos específicos y configurar alertas.
Ejemplo 1: Script sencillo para comprobar el espacio libre
#!/bin/bash
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en porcentaje (por ejemplo, 10%)
THRESHOLD=10
# Obtenemos el porcentaje de uso del disco
USAGE=$(df -h "$DISK" | awk 'NR==2{print $5}' | tr -d '%')
# Comprobamos si se ha superado el umbral
if [ "$USAGE" -gt $(expr 100 - $THRESHOLD) ]; then
echo "¡Atención! En el disco $DISK queda menos del $THRESHOLD% de espacio libre."
fi
Este script realiza las siguientes acciones:
- Define la partición del disco a monitorizar (
DISK="/"). - Establece el umbral de espacio libre en porcentaje (
THRESHOLD=10). - Utiliza
df -h "$DISK"para obtener información sobre el uso del disco en un formato legible. - Con
awk 'NR==2{print $5}'extrae el porcentaje de uso del disco de la segunda línea de la salida dedf(donde se encuentra la información de la partición). tr -d '%'elimina el símbolo de porcentaje de la cadena obtenida.- Compara el porcentaje de uso con el umbral. Si el porcentaje de uso supera
100 - $THRESHOLD, muestra una advertencia.
Ejemplo 2: Script más detallado con salida de información sobre el espacio libre en gigabytes
#!/bin/bash
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en gigabytes
THRESHOLD=5
# Obtenemos el espacio libre en gigabytes
FREE_GB=$(df -h "$DISK" | awk 'NR==2{print $4}')
# Eliminamos la letra 'G' del valor
FREE_GB_NUM=$(echo "$FREE_GB" | sed 's/G//')
# Comprobamos si el espacio libre es menor que el umbral
if (( $(echo "$FREE_GB_NUM > $THRESHOLD" | bc -l) )); then
echo "¡Atención! En el disco $DISK queda menos de $THRESHOLD GB de espacio libre. Ahora libre: $FREE_GB"
fi
Este script hace lo mismo, pero utiliza gigabytes en lugar de porcentajes, lo que puede ser más claro:
- Obtiene el espacio libre en gigabytes con
df -h "$DISK" | awk 'NR==2{print $4}'. - Elimina la letra ‘G’ del valor obtenido con
sed 's/G//'. - Utiliza
bc -lpara comparar números de punto flotante, ya quedf -hpuede mostrar valores con decimales. - Muestra una advertencia si el espacio libre es menor que el umbral.
Ejemplo 3: Monitorización de varias particiones del disco
#!/bin/bash
# Particiones del disco a monitorizar
DISKS=("/")
# Umbral del espacio libre en porcentaje
THRESHOLD=10
# Recorremos las particiones del disco
for DISK in ${DISKS[@]}; do
# Obtenemos el porcentaje de uso del disco
USAGE=$(df -h "$DISK" | awk 'NR==2{print $5}' | tr -d '%')
# Comprobamos si se ha superado el umbral
if [ "$USAGE" -gt $(expr 100 - $THRESHOLD) ]; then
echo "¡Atención! En el disco $DISK queda menos del $THRESHOLD% de espacio libre."
fi
done
En este ejemplo, el script recorre varias particiones del disco, especificadas en el array DISKS, y realiza la comprobación para cada una de ellas.
Para automatizar la ejecución del script, añádelo a cron. Por ejemplo, para ejecutar el script cada 5 minutos, añade la siguiente línea a crontab:
*/5 * * * * /path/to/your/script.sh
Sustituye /path/to/your/script.sh por la ruta real a tu script.
Consejo de experto: No olvides añadir logging a tus scripts de monitorización. Esto te ayudará a rastrear el historial de cambios y a identificar tendencias a largo plazo en el uso del espacio en disco.
Iván Petrov, Administrador de sistemas
Monitorización con Python y la biblioteca psutil
Python ofrece un enfoque más flexible y potente para monitorizar el espacio en disco, especialmente con el uso de la biblioteca psutil (process and system utilities). psutil permite obtener información sobre el sistema, incluyendo el uso del disco, en un formato fácil de procesar.
Ejemplo 1: Script sencillo de Python para comprobar el espacio libre
import psutil
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en porcentaje
THRESHOLD = 10
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Comprobamos si se ha superado el umbral
if usage_percent > (100 - THRESHOLD):
print(f"¡Atención! En el disco {DISK} queda menos del {THRESHOLD}% de espacio libre. Usado: {usage_percent}%")
Este script realiza las siguientes acciones:
- Importa la biblioteca
psutil. - Define la partición del disco a monitorizar (
DISK="/"). - Establece el umbral de espacio libre en porcentaje (
THRESHOLD = 10). - Utiliza
psutil.disk_usage(DISK)para obtener información sobre el uso del disco. - Extrae el porcentaje de uso del disco del objeto
disk_usage. - Compara el porcentaje de uso con el umbral y muestra una advertencia si se supera el umbral.
Ejemplo 2: Script de Python con salida de información sobre el espacio libre en gigabytes
import psutil
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en gigabytes
THRESHOLD = 5
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el espacio libre en gigabytes
free_gb = disk_usage.free / (230) # Convertimos bytes a GB
# Comprobamos si el espacio libre es menor que el umbral
if free_gb < THRESHOLD:
print(f"¡Atención! En el disco {DISK} queda menos de {THRESHOLD} GB de espacio libre. Libre: {free_gb:.2f} GB")
Este script muestra cómo obtener y mostrar el espacio libre en gigabytes. Observa la conversión de bytes a gigabytes (free_gb = disk_usage.free / (2**30)) y el formato de la salida para mostrar dos decimales ({free_gb:.2f}).
Ejemplo 3: Monitorización de varias particiones del disco con Python
import psutil
# Particiones del disco a monitorizar
DISKS = ["/", "/home"]
# Umbral del espacio libre en porcentaje
THRESHOLD = 10
# Recorremos las particiones del disco
for DISK in DISKS:
try:
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Comprobamos si se ha superado el umbral
if usage_percent > (100 - THRESHOLD):
print(f"¡Atención! En el disco {DISK} queda menos del {THRESHOLD}% de espacio libre. Usado: {usage_percent}%")
except FileNotFoundError:
print(f"La partición del disco {DISK} no se ha encontrado.")
En este ejemplo, el script recorre una lista de particiones del disco y realiza la comprobación para cada una de ellas. Observa el bloque try...except, que maneja el caso en que no se encuentra una partición del disco.
Para ejecutar un script de Python también puedes usar cron. Por ejemplo, para ejecutar el script cada 5 minutos, añade la siguiente línea en crontab:
*/5 * * * * /usr/bin/python3 /path/to/your/script.py
Sustituye /usr/bin/python3 por la ruta a tu intérprete de Python, y /path/to/your/script.py por la ruta real a tu script.
| Función | Descripción |
|---|---|
psutil.disk_usage(path) | Devuelve un objeto con información sobre el uso del disco para la ruta especificada. |
disk_usage.total | Tamaño total de la partición del disco en bytes. |
disk_usage.used | Espacio utilizado en el disco en bytes. |
disk_usage.free | Espacio libre en el disco en bytes. |
disk_usage.percent | Porcentaje de uso del disco. |
Configuración del envío de notificaciones por correo electrónico
Para reaccionar rápidamente ante los problemas con el espacio en disco, es necesario configurar el envío de notificaciones por correo electrónico. Podemos añadir esta funcionalidad a nuestros scripts utilizando diversas herramientas y bibliotecas.
Ejemplo 1: Envío de notificaciones por correo electrónico con el comando mail (bash)
#!/bin/bash
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en porcentaje
THRESHOLD=10
# Obtenemos el porcentaje de uso del disco
USAGE=$(df -h "$DISK" | awk 'NR==2{print $5}' | tr -d '%')
# Comprobamos si se ha superado el umbral
if [ "$USAGE" -gt $(expr 100 - $THRESHOLD) ]; then
SUBJECT="¡Atención! Poco espacio en el disco $DISK"
BODY="En el disco $DISK queda menos del $THRESHOLD% de espacio libre. Usado: $USAGE%"
echo "$BODY" | mail -s "$SUBJECT" your_email@example.com
fi
Este script envía un correo electrónico con el comando mail si se supera el umbral de uso del disco. Sustituye your_email@example.com por tu dirección de correo electrónico.
Nota: Para usar el comando mail en tu VDS, puede que sea necesario instalar y configurar un servidor de correo (por ejemplo, Postfix). Si el servidor de correo no está configurado, es posible que el envío de correos no funcione.
Ejemplo 2: Envío de notificaciones por correo electrónico con la biblioteca smtplib (Python)
import psutil
import smtplib
from email.mime.text import MIMEText
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en porcentaje
THRESHOLD = 10
# Tu dirección de correo electrónico y contraseña
SENDER_EMAIL = "your_email@example.com"
SENDER_PASSWORD = "your_password"
# Dirección de correo electrónico del destinatario
RECEIVER_EMAIL = "recipient_email@example.com"
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Comprobamos si se ha superado el umbral
if usage_percent > (100 - THRESHOLD):
SUBJECT = f"¡Atención! Poco espacio en el disco {DISK}"
BODY = f"En el disco {DISK} queda menos del {THRESHOLD}% de espacio libre. Usado: {usage_percent}%"
# Creamos el objeto MIME
msg = MIMEText(BODY)
msg['Subject'] = SUBJECT
msg['From'] = SENDER_EMAIL
msg['To'] = RECEIVER_EMAIL
# Enviamos el correo
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(SENDER_EMAIL, SENDER_PASSWORD)
smtp.send_message(msg)
print("¡Correo enviado correctamente!")
except Exception as e:
print(f"Error al enviar el correo: {e}")
Este script envía un correo electrónico utilizando la biblioteca smtplib. Sustituye your_email@example.com, your_password y recipient_email@example.com por tus credenciales y la dirección del destinatario. Este ejemplo usa el servidor SMTP de Gmail. Es posible que tengas que habilitar el «acceso para aplicaciones menos seguras» en la configuración de tu cuenta de Google.
Importante: Almacenar contraseñas en scripts no es seguro. Considera usar variables de entorno u otras formas más seguras de almacenar las credenciales.
Ejemplo 3: Envío de notificaciones a través de Telegram Bot (Python)
import psutil
import telegram
# Partición del disco a monitorizar
DISK="/"
# Umbral del espacio libre en porcentaje
THRESHOLD = 10
# Token de tu bot de Telegram
TELEGRAM_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
# ID de tu chat de Telegram
TELEGRAM_CHAT_ID = "YOUR_TELEGRAM_CHAT_ID"
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Comprobamos si se ha superado el umbral
if usage_percent > (100 - THRESHOLD):
MESSAGE = f"¡Atención! En el disco {DISK} queda menos del {THRESHOLD}% de espacio libre. Usado: {usage_percent}%"
# Enviamos el mensaje a través del bot de Telegram
try:
bot = telegram.Bot(token=TELEGRAM_TOKEN)
bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=MESSAGE)
print("¡Mensaje enviado correctamente a Telegram!")
except Exception as e:
print(f"Error al enviar el mensaje a Telegram: {e}")
Este script envía una notificación a través de un bot de Telegram. Necesitarás crear un bot de Telegram y obtener su token, y también obtener el ID de tu chat. Sustituye YOUR_TELEGRAM_BOT_TOKEN y YOUR_TELEGRAM_CHAT_ID por tus valores.
Opciones avanzadas de monitorización y registro
Para una monitorización más eficaz del espacio en disco, se recomienda utilizar opciones avanzadas, como el registro (logging), el análisis de datos históricos y la integración con sistemas de monitorización.
Ejemplo 1: Registro del uso del espacio en disco (Python)
import psutil
import datetime
import logging
# Configuración del logging
logging.basicConfig(filename="/var/log/disk_space.log", level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
# Partición del disco a monitorizar
DISK="/"
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Registramos la información
logging.info(f"Uso del disco {DISK}: {usage_percent}%")
# Comprobamos si se ha superado el umbral (opcional, se puede registrar sólo si se supera el umbral)
THRESHOLD = 90
if usage_percent > THRESHOLD:
logging.warning(f"¡Atención! En el disco {DISK} se ha usado más del {THRESHOLD}% del espacio: {usage_percent}%")
Este script añade el registro del uso del espacio en disco en el archivo /var/log/disk_space.log. Registra la información sobre el uso del disco cada vez que se ejecuta. Además, si el uso del disco supera un umbral determinado (en este caso, el 90%), se registra una advertencia.
Ejemplo 2: Envío de datos a un sistema de monitorización (por ejemplo, Zabbix) (Python)
import psutil
import subprocess
# Partición del disco a monitorizar
DISK="/"
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Enviamos los datos a Zabbix con 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"Datos enviados correctamente a Zabbix: {stdout.decode()}")
else:
print(f"Error al enviar los datos a Zabbix: {stderr.decode()}")
Este script envía el porcentaje de uso del disco al sistema de monitorización Zabbix utilizando la utilidad zabbix_sender. Sustituye your_zabbix_server, your_zabbix_host y disk.usage.percent por los valores correspondientes para tu sistema Zabbix. Es necesario que zabbix_sender esté instalado y configurado en tu VDS.
Ejemplo 3: Análisis de datos históricos con Grafana e InfluxDB
Para analizar datos históricos sobre el uso del espacio en disco, se puede usar una combinación de InfluxDB (para el almacenamiento de datos) y Grafana (para la visualización). Primero, es necesario configurar InfluxDB y Grafana. A continuación, se puede modificar el script de monitorización para que registre los datos en InfluxDB. Ejemplo (Python):
import psutil
from influxdb import InfluxDBClient
# Partición del disco a monitorizar
DISK="/"
# Parámetros de InfluxDB
INFLUXDB_HOST = "your_influxdb_host"
INFLUXDB_PORT = 8086
INFLUXDB_DATABASE = "disk_monitoring"
# Obtenemos información sobre el uso del disco
disk_usage = psutil.disk_usage(DISK)
# Obtenemos el porcentaje de uso del disco
usage_percent = disk_usage.percent
# Creamos el cliente de InfluxDB
client = InfluxDBClient(host=INFLUXDB_HOST, port=INFLUXDB_PORT, database=INFLUXDB_DATABASE)
# Formamos los datos para el registro
data = [
{
"measurement": "disk_usage",
"tags": {
"disk": DISK
},
"fields": {
"usage_percent": usage_percent
}
}
]
# Registramos los datos en InfluxDB
try:
client.write_points(data)
print("Datos registrados correctamente en InfluxDB")
except Exception as e:
print(f"Error al registrar los datos en InfluxDB: {e}")
Este script registra el porcentaje de uso del disco en la base de datos InfluxDB. Sustituye your_influxdb_host y disk_monitoring por los valores correspondientes para tu sistema InfluxDB. Después de esto, puedes crear un panel en Grafana para visualizar estos datos.
Estos ejemplos muestran cómo se puede ampliar la monitorización básica del espacio en disco para obtener una imagen más completa y automatizar la respuesta a los problemas.
«`