09 · Servicio de limpieza al iniciar

Este es exactamente el caso que comentas: un servicio que al arrancar el sistema limpia basura (papelera y restos de NTFS) para que no aparezcan errores con los discos montados.

¿Qué vamos a limpiar?

Tres fuentes típicas de "basura" cuando usas NTFS:

  1. Papelera del usuario: ~/.local/share/Trash/files/ e info/.
  2. Papelera de Windows en discos NTFS: carpetas $RECYCLE.BIN.
  3. Restos de .Trash-* que crean otros sistemas al borrar en NTFS.
El script NO borra System Volume Information: es una carpeta del sistema de Windows, mejor no tocarla. Nuestro script solo limpia papeleras.

Paso 1: crear el script

sudo nano /usr/local/bin/limpieza-inicio.sh

Contenido completo:

#!/bin/bash
# Limpieza de basura al iniciar
# Se ejecuta como root (via systemd), así que podemos borrar basura del sistema
# y de los discos NTFS en /mnt.

LOG="/var/log/limpieza-inicio.log"

echo "===== Limpieza iniciada: $(date) =====" >> "$LOG"

# --- 1) Papelera del usuario principal ---
# Detecta el primer usuario humano (UID 1000 por convención)
USER_HOME=$(getent passwd 1000 | cut -d: -f6)
if [ -n "$USER_HOME" ] && [ -d "$USER_HOME/.local/share/Trash" ]; then
    echo "Limpiando papelera de $USER_HOME" >> "$LOG"
    rm -rf "$USER_HOME/.local/share/Trash/files/"* 2>>"$LOG"
    rm -rf "$USER_HOME/.local/share/Trash/info/"* 2>>"$LOG"
fi

# --- 2) Basura en discos NTFS montados en /mnt ---
# Busca en cada subcarpeta de /mnt (disco1, disco2, disco3...)
for MOUNT_DIR in /mnt/*/ ; do
    [ -d "$MOUNT_DIR" ] || continue
    echo "Procesando $MOUNT_DIR" >> "$LOG"

    # Papelera de Windows
    find "$MOUNT_DIR" -maxdepth 1 -type d -iname '$RECYCLE.BIN' -exec rm -rf {} + 2>>"$LOG"

    # Restos de basura de Linux
    find "$MOUNT_DIR" -maxdepth 1 -type d -name '.Trash-*' -exec rm -rf {} + 2>>"$LOG"
done

# --- 3) Limpieza opcional de temporales del sistema ---
# Solo archivos con más de 7 días en /tmp (evita borrar archivos en uso)
find /tmp -type f -atime +7 -delete 2>>"$LOG"

echo "===== Limpieza finalizada: $(date) =====" >> "$LOG"
echo "" >> "$LOG"

Dale permisos:

sudo chmod 755 /usr/local/bin/limpieza-inicio.sh
sudo chown root:root /usr/local/bin/limpieza-inicio.sh

Paso 2: probar el script a mano

Antes de convertirlo en servicio, ejecútalo manualmente y comprueba que hace lo esperado. Revisa primero con find qué va a borrar si tienes dudas.
sudo /usr/local/bin/limpieza-inicio.sh
sudo cat /var/log/limpieza-inicio.log

Deberías ver algo como:

===== Limpieza iniciada: Mon Oct 27 12:34:56 2026 =====
Limpiando papelera de /home/tu_usuario
Procesando /mnt/disco1/
Procesando /mnt/disco2/
Procesando /mnt/disco3/
===== Limpieza finalizada: Mon Oct 27 12:34:57 2026 =====

Paso 3: crear el servicio

Este servicio debe ejecutarse después de que los discos estén montados. Por eso usamos After=local-fs.target (los montajes del fstab ya han ocurrido).

sudo nano /etc/systemd/system/limpieza-inicio.service
[Unit]
Description=Limpieza de basura y restos NTFS al iniciar
After=local-fs.target
Requires=local-fs.target
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/usr/local/bin/limpieza-inicio.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
DirectivaPor qué
After=local-fs.targetEspera a que los discos del fstab estén montados
Requires=local-fs.targetFuerza a que se cumpla la dependencia
DefaultDependencies=noPermite que corra antes de la fase normal de arranque si fuera necesario
Type=oneshotScript que termina
RemainAfterExit=yesSystemd lo considera activo tras finalizar
WantedBy=multi-user.targetSe ejecuta en cada arranque normal

Paso 4: activar el servicio

sudo systemctl daemon-reload
sudo systemctl enable --now limpieza-inicio.service

Paso 5: verificar

systemctl status limpieza-inicio.service
sudo cat /var/log/limpieza-inicio.log
journalctl -u limpieza-inicio.service -n 20

Deberías ver Active: active (exited) y el log con las líneas del script.

Variante: solo en algunos discos

Si no quieres limpiar todos los discos, cambia esta línea del script:

for MOUNT_DIR in /mnt/*/ ; do

por algo como:

for MOUNT_DIR in /mnt/disco1/ /mnt/disco2/ ; do

Cómo deshacerlo todo

sudo systemctl disable --now limpieza-inicio.service
sudo rm /etc/systemd/system/limpieza-inicio.service
sudo rm /usr/local/bin/limpieza-inicio.sh
sudo systemctl daemon-reload
Si prefieres que la limpieza se ejecute periódicamente y no solo al arrancar, combínala con un .timer (ver página 07) en vez de un .service con WantedBy=multi-user.target. Puedes tener las dos cosas: uno al arrancar y otro diario.

Por qué esto evita errores con NTFS

🧪 Práctica sugerida

  1. Crea el script y pruébalo a mano. Comprueba el log.
  2. Crea el .service, daemon-reload y enable --now.
  3. Haz sudo systemctl status limpieza-inicio.
  4. Borra algo a propósito, vacía la papelera manualmente y reinicia. Al volver, la papelera debe estar vacía y el log con una nueva entrada.
  5. Revisa sudo cat /var/log/limpieza-inicio.log tras reiniciar.
Anterior← NTFS