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:
python programa.py > salida_limitada.outputQueremos 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):
# 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.outputVentajas:
- 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):
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)
stdbuf -oL python programa.py | tail -c 2M > salida_limitada.outputNo 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):
sudo nano /etc/logrotate.d/salida_manualContenido:
/ruta/completa/salida_limitada.output {
size 2M
rotate 1
copytruncate
missingok
notifempty
}Luego puedes forzar la rotación manualmente cuando quieras:
logrotate -f /etc/logrotate.d/salida_manualO 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)
#!/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:
python programa.py | ./limit_output.shO en una sola línea:
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ón | Recomendación principal | Comando sugerido (2 MB) |
|---|---|---|
| Uso rápido, pruebas, una sola ejecución | tail + sponge | python programa.py | tail -c 2M | sponge salida_limitada.output |
| Quieres líneas completas | tail -n XXXX + sponge | tail -n 40000 (ajustar número) |
| Uso prolongado / producción | logrotate con size + copytruncate | Ver configuración arriba |
| No quieres instalar nada | Script bash con tail cada cierto tiempo | El script de más arriba |
| Quieres algo muy muy ligero | tail -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.


