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
-
atimedepende del montaje del filesystem; revisar/etc/fstabomountsi hay dudas. - La prioridad baja se aplica con
nice -n 19yionice -c3para 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 /'

