lunes, 6 de abril de 2026

Cómo limitar el tamaño de un archivo en Linux para que no crezca indefinidamente

 

Hay varias formas de limitar el tamaño de un archivo en Linux para que no crezca indefinidamente y mantenga solo los datos más recientes (comportamiento tipo "buffer circular" o "ring buffer"). Aquí te muestro las soluciones más prácticas y usadas en 2025-2026 para tu caso concreto:

Bash
python programa.py > salida_limitada.output

Queremos que salida_limitada.output nunca supere ~2 MB y que elimine contenido antiguo automáticamente.

Opciones recomendadas (de más sencilla a más robusta)

1. La más fácil y directa (recomendada para la mayoría de casos)

Usa tail + sponge (del paquete moreutils):

Bash
# Instalar moreutils si no lo tienes
sudo apt install moreutils    # Debian/Ubuntu
sudo dnf install moreutils    # Fedora
sudo pacman -S moreutils      # Arch

# Ejecución
python programa.py | tail -c 2M | sponge salida_limitada.output

Ventajas:

  • Muy simple
  • Mantiene exactamente los últimos 2 MB (o un poco menos si corta a mitad de línea)
  • El archivo nunca crece más de ~2 MB

Variante más bonita (mantiene líneas completas):

Bash
python programa.py | tail -n 50000 | sponge salida_limitada.output

(ajusta el número de líneas según tu caso — 50.000 líneas suelen caber en < 2 MB en la mayoría de logs)

2. Usando stdbuf + tail (sin moreutils)

Bash
stdbuf -oL python programa.py | tail -c 2M > salida_limitada.output

No es perfecto porque > trunca el archivo cada vez → puede perder datos si el programa escribe muy rápido. La opción con sponge es superior.

3. La opción más profesional y usada en producción: logrotate con copytruncate y size

Crea este archivo (por ejemplo):

Bash
sudo nano /etc/logrotate.d/salida_manual

Contenido:

text
/ruta/completa/salida_limitada.output {
    size 2M
    rotate 1
    copytruncate
    missingok
    notifempty
}

Luego puedes forzar la rotación manualmente cuando quieras:

Bash
logrotate -f /etc/logrotate.d/salida_manual

O dejar que se ejecute automáticamente (normalmente cada día).

Ventaja: sistema muy robusto, usado por casi todos los servicios de Linux.

4. Script bash muy simple (buen compromiso)

Bash
#!/usr/bin/env bash
# guardar como: limit_output.sh
# chmod +x limit_output.sh

MAX_SIZE=$((2*1024*1024))  # 2 MiB
FILE="salida_limitada.output"

# Si el archivo existe y es > 2MB → truncamos a las últimas 2MB
if [[ -f "$FILE" && $(stat -c %s "$FILE") -gt $MAX_SIZE ]]; then
    tail -c $MAX_SIZE "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
fi

# Añadimos la nueva salida al final
cat >> "$FILE"

Uso:

Bash
python programa.py | ./limit_output.sh

O en una sola línea:

Bash
python programa.py | tee -a salida_limitada.output | awk -v f=salida_limitada.output -v max=2097152 'BEGIN{ s=0 } {s+=length($0)+1} s>max{ system("tail -c "max" "f" > "f".tmp && mv "f".tmp "f); s=max }'

(versión compacta pero menos legible)

Resumen — ¿Qué te recomiendo según tu caso?

SituaciónRecomendación principalComando sugerido (2 MB)
Uso rápido, pruebas, una sola ejecucióntail + spongepython programa.py | tail -c 2M | sponge salida_limitada.output
Quieres líneas completastail -n XXXX + spongetail -n 40000 (ajustar número)
Uso prolongado / producciónlogrotate con size + copytruncateVer configuración arriba
No quieres instalar nadaScript bash con tail cada cierto tiempoEl script de más arriba
Quieres algo muy muy ligerotail -c 2M > salida_limitada.output (pierde datos intermedios)No recomendado si el programa escribe continuamente

La opción tail + sponge es la que más gente usa hoy en día para este caso concreto de redirección simple.

No hay comentarios:

Publicar un comentario