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:
- Papelera del usuario:
~/.local/share/Trash/files/einfo/. - Papelera de Windows en discos NTFS: carpetas
$RECYCLE.BIN. - 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
| Directiva | Por qué |
|---|---|
After=local-fs.target | Espera a que los discos del fstab estén montados |
Requires=local-fs.target | Fuerza a que se cumpla la dependencia |
DefaultDependencies=no | Permite que corra antes de la fase normal de arranque si fuera necesario |
Type=oneshot | Script que termina |
RemainAfterExit=yes | Systemd lo considera activo tras finalizar |
WantedBy=multi-user.target | Se 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
- Si el directorio
$RECYCLE.BINestá corrupto o bloqueado, algunas operaciones pueden fallar. Limpiarlo al arrancar evita sorpresas. - Las carpetas
.Trash-*pueden dejar inodos huérfanos en NTFS; eliminarlas en frío es seguro. - La papelera del usuario a veces apunta a rutas inexistentes (por ejemplo, si borraste un archivo de un disco que ya no está montado); limpiarla al inicio evita que aparezcan entradas rotas.
🧪 Práctica sugerida
- Crea el script y pruébalo a mano. Comprueba el log.
- Crea el
.service,daemon-reloadyenable --now. - Haz
sudo systemctl status limpieza-inicio. - 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.
- Revisa
sudo cat /var/log/limpieza-inicio.logtras reiniciar.