LiveCommerce Blog

Tecnología, estrategia y resultados en ecommerce

Eliminar imágenes sin acceso en más de dos años en producción mediante limpieza incremental controlada en Linux

Limpieza segura de imágenes antiguas en servidor e-commerce usando atime

En servidores de e-commerce, el repositorio de imágenes crece de forma acumulativa hasta ocupar varios terabytes. Una forma operativa de recuperar espacio sin romper tráfico real consiste en eliminar ficheros que no han sido accedidos en un umbral de tiempo, por ejemplo 730 días.

Qué es atime y por qué sirve

En Linux, atime es la marca temporal de último acceso de un archivo. Si el sistema de ficheros actualiza atime, puede usarse como proxy de uso real: si una imagen no se lee en dos años, es probable que sea inactiva.

El criterio de selección es:

find /ruta -type f -atime +730

La validez depende de las opciones de montaje. Con noatime no se actualiza atime. Con relatime suele ser suficientemente fiable para mantenimiento.

Objetivo

Eliminar imágenes sin acceso en más de 730 días, reduciendo impacto en disco y manteniendo trazabilidad del proceso.

Script de limpieza incremental con baja prioridad

El siguiente script procesa carpeta por carpeta, aplica baja prioridad de CPU e I/O y registra progreso en un log. Está pensado para ejecutarse en producción con impacto controlado.

cat > /root/cleanup_images_safe.sh << 'EOF'
#!/bin/bash
#
# Script de limpieza segura de database_images_urls
# Procesa carpeta por carpeta con pausas para no saturar el disco
#

BASE="/var/www/livecommerce.fronts/web/database_images_urls"
LOG="/root/cleanup_progress.log"
DAYS=730  # Archivos sin acceso en más de 2 años

echo "========================================" | tee $LOG
echo "Inicio limpieza: $(date)" | tee -a $LOG
echo "Directorio: $BASE" | tee -a $LOG
echo "Días sin acceso: $DAYS" | tee -a $LOG
echo "========================================" | tee -a $LOG
echo "" | tee -a $LOG

# Espacio inicial
echo "Espacio ANTES de limpiar:" | tee -a $LOG
df -h / | grep loop0 | tee -a $LOG
echo "" | tee -a $LOG

# Contador de carpetas procesadas
COUNT=0
TOTAL=$(ls -1d $BASE/?? 2>/dev/null | wc -l)

# Procesar cada carpeta hash una por una
for folder in $BASE/??; do
    if [ -d "$folder" ]; then
        COUNT=$((COUNT + 1))
        FOLDER_NAME=$(basename "$folder")
        
        echo "[$COUNT/$TOTAL] Procesando carpeta: $FOLDER_NAME - $(date)" | tee -a $LOG
        
        # Contar archivos a borrar
        FILES_TO_DELETE=$(ionice -c3 nice -n 19 find "$folder" -type f -atime +$DAYS 2>/dev/null | wc -l)
        echo "  Archivos a borrar: $FILES_TO_DELETE" | tee -a $LOG
        
        # Borrar archivos con baja prioridad I/O
        ionice -c3 nice -n 19 find "$folder" -type f -atime +$DAYS -delete 2>/dev/null
        
        # Mostrar espacio actual
        echo "  Espacio después de $FOLDER_NAME:" | tee -a $LOG
        df -h / | grep loop0 | awk '{print "    Usado: "$3" / "$2" ("$5") - Libre: "$4}' | tee -a $LOG
        
        # Pausa entre carpetas para no saturar el disco
        echo "  Pausa 30 segundos..." | tee -a $LOG
        sleep 30
        echo "" | tee -a $LOG
    fi
done

echo "========================================" | tee -a $LOG
echo "Limpieza COMPLETADA: $(date)" | tee -a $LOG
echo "========================================" | tee -a $LOG

# Espacio final
echo "" | tee -a $LOG
echo "Espacio DESPUÉS de limpiar:" | tee -a $LOG
df -h / | grep loop0 | tee -a $LOG

# Resumen
echo "" | tee -a $LOG
echo "Carpetas procesadas: $COUNT de $TOTAL" | tee -a $LOG
echo "Log completo en: $LOG" | tee -a $LOG
EOF

chmod +x /root/cleanup_images_safe.sh

echo "Script creado en: /root/cleanup_images_safe.sh"
echo ""
echo "Para ejecutar:"
echo "  1. En primer plano (verás el progreso):  /root/cleanup_images_safe.sh"
echo "  2. En segundo plano:                     nohup /root/cleanup_images_safe.sh &"
echo ""
echo "Para monitorear el progreso:"
echo "  tail -f /root/cleanup_progress.log"
echo ""
echo "Para ver espacio liberándose:"
echo "  watch -n 10 'df -h /'"

Cómo ejecutarlo y monitorizar

Ejecución en primer plano:

/root/cleanup_images_safe.sh

Ejecución en segundo plano:

nohup /root/cleanup_images_safe.sh &

Seguimiento del log:

tail -f /root/cleanup_progress.log

Vigilancia de espacio:

watch -n 10 'df -h /'

Notas operativas

  • atime depende del montaje del filesystem; revisar /etc/fstab o mount si hay dudas.
  • La prioridad baja se aplica con nice -n 19 y ionice -c3 para minimizar impacto.
  • El procesamiento por carpetas y la pausa entre iteraciones reducen picos sostenidos de I/O.

Resultado

Se libera espacio eliminando únicamente imágenes sin acceso real durante el umbral definido, manteniendo trazabilidad mediante log y evitando saturación del disco durante el proceso.

Crear archivo

cat > /root/cleanup_images_safe.sh << 'EOF'
#!/bin/bash
#
# Script de limpieza segura de database_images_urls
# Procesa carpeta por carpeta con pausas para no saturar el disco
#

BASE="/var/www/livecommerce.fronts/web/database_images_urls"
LOG="/root/cleanup_progress.log"
DAYS=730  # Archivos sin acceso en más de 2 años

echo "========================================" | tee $LOG
echo "Inicio limpieza: $(date)" | tee -a $LOG
echo "Directorio: $BASE" | tee -a $LOG
echo "Días sin acceso: $DAYS" | tee -a $LOG
echo "========================================" | tee -a $LOG
echo "" | tee -a $LOG

# Espacio inicial
echo "Espacio ANTES de limpiar:" | tee -a $LOG
df -h / | grep loop0 | tee -a $LOG
echo "" | tee -a $LOG

# Contador de carpetas procesadas
COUNT=0
TOTAL=$(ls -1d $BASE/?? 2>/dev/null | wc -l)

# Procesar cada carpeta hash una por una
for folder in $BASE/??; do
    if [ -d "$folder" ]; then
        COUNT=$((COUNT + 1))
        FOLDER_NAME=$(basename "$folder")
        
        echo "[$COUNT/$TOTAL] Procesando carpeta: $FOLDER_NAME - $(date)" | tee -a $LOG
        
        # Contar archivos a borrar
        FILES_TO_DELETE=$(ionice -c3 nice -n 19 find "$folder" -type f -atime +$DAYS 2>/dev/null | wc -l)
        echo "  Archivos a borrar: $FILES_TO_DELETE" | tee -a $LOG
        
        # Borrar archivos con baja prioridad I/O
        ionice -c3 nice -n 19 find "$folder" -type f -atime +$DAYS -delete 2>/dev/null
        
        # Mostrar espacio actual
        echo "  Espacio después de $FOLDER_NAME:" | tee -a $LOG
        df -h / | grep loop0 | awk '{print "    Usado: "$3" / "$2" ("$5") - Libre: "$4}' | tee -a $LOG
        
        # Pausa entre carpetas para no saturar el disco
        echo "  Pausa 30 segundos..." | tee -a $LOG
        sleep 30
        echo "" | tee -a $LOG
    fi
done

echo "========================================" | tee -a $LOG
echo "Limpieza COMPLETADA: $(date)" | tee -a $LOG
echo "========================================" | tee -a $LOG

# Espacio final
echo "" | tee -a $LOG
echo "Espacio DESPUÉS de limpiar:" | tee -a $LOG
df -h / | grep loop0 | tee -a $LOG

# Resumen
echo "" | tee -a $LOG
echo "Carpetas procesadas: $COUNT de $TOTAL" | tee -a $LOG
echo "Log completo en: $LOG" | tee -a $LOG
EOF

chmod +x /root/cleanup_images_safe.sh

echo "Script creado en: /root/cleanup_images_safe.sh"
echo ""
echo "Para ejecutar:"
echo "  1. En primer plano (verás el progreso):  /root/cleanup_images_safe.sh"
echo "  2. En segundo plano:                     nohup /root/cleanup_images_safe.sh &"
echo ""
echo "Para monitorear el progreso:"
echo "  tail -f /root/cleanup_progress.log"
echo ""
echo "Para ver espacio liberándose:"
echo "  watch -n 10 'df -h /'"

Ejecución

# Opción A: Primer plano (recomendado para ver que funciona)
/root/cleanup_images_safe.sh

# Opción B: Segundo plano (puedes cerrar la terminal)
nohup /root/cleanup_images_safe.sh &

# Monitorear progreso
tail -f /root/cleanup_progress.log

# Ver espacio en tiempo real (otra terminal)
watch -n 10 'df -h /'
Compártelo:

¿Tienes alguna consulta?

Si tienes alguna pregunta o sabes la respuesta sobre algún comentario, no dudes en contribuir.
Responderemos rápidamente.
Puedes utilizar etiquetas BBCode para escribir negrita, enlaces, imágenes, etc...
Más información en la página oficial de BBCOde http://www.bbcode.org/ Ejemplo:
[url=http://google.com]links[/url], [color=red]colores[/color] [b]negrita[/b]...

¿Has visto los videos en nuestro canal de Youtube?

En nuestro canal de Youtube publicamos periódicamente mejoras y funcionalidades del software de ecommerce.