Disparadores Linux: Inotify - entr

Linux Nivel Medio 13 de jul. de 2026

Seguimos ampliando nuestra lista de eventos que disparan acciones en Linux.

En este artículo vamos a ver como hacer que una operación sobre una carpeta desencadene una serie de tareas.

¿Qué es Inotify?

inotify (inode notify) es un subsistema del kernel de Linux que monitoriza los cambios en el sistema de archivos y notifica a las aplicaciones cuando ocurren eventos (como crear, borrar, modificar o mover archivos).

La herramienta inotify-tools es un conjunto de utilidades para la línea de comandos que te permite interactuar con este subsistema. La herramienta más importante para nuesto uso es inotifywait, que espera pasivamente a que ocurra un evento y luego ejecuta una acción.

Ademas de Inotify disponemos tambien de otras herramientas como entr (Event Notify Test Runner) que está diseñado originalmente para pasarle una lista de archivos (a través de stdin) y ejecutar un comando cada vez que uno de esos archivos cambia.

¿Hay que combinar inotify con entr?

En realidad, no es necesario combinar inotify-tools con entr, ya que ambas herramientas hacen un trabajo similar pero con enfoques distintos:

  • inotifywait es ideal para monitorizar carpetas enteras .
  • entr (Event Notify Test Runner) está diseñado para monitorizar una lista de archivos.

Para nuestro uso, en el que queremos realizar una serie de Acciones sobre una Carpeta, simplemente necesitamos vigilar un directorio y actúar cuando algo sucede dentro de él, para nosotros inotifywait va a ser la solución más directa y eficiente.

Ejemplo Práctico: Conversión automática a .webp


En mi caso, cada vez que escribo un artículo me gusta realizar una imagen de cabecera para el artículo, a veces me peleo un rato grande con Gimp realizando un boceto de como lo quiero y luego me ayudo de la IA para que retoque el boceto y lo deje con un estilo profesional.

Como me gusta "ahorrar bytes", generalmente el resultado final una imagen en formato PNG o JPG lo suelo transformar al formato .webp

Tengo mis propios scripts que pueden transformar con sólo una línea de comando uno o varias imagenes de cualquier formato a WEBP.

Para agilizar esta transformación vamos a crear un sistema que vigile una carpeta llamada ~/Imágenes/Webp, en el instante en que guarde un archivo .jpg o .png ahí, se generará su versión .webp automáticamente.

Paso 1: Instalar las herramientas necesarias

En Debian, hay que instalar inotify-tools y webp (para usar el comando de conversión cwebp):

sudo apt update
sudo apt -y install inotify-tools webp

Paso 2: Crear el script de automatización

Vamos a crear un script que se quedará escuchando en segundo plano, lo vamos a guardar en la ruta:
~/.local/bin/centinela_dir.sh

#!/bin/bash
# Script: centinela_dir
# Autor: luisgulo (SoloConLinux)
# Versión: 1.2

# Carpeta a vigilar
DIR_VIGILADO="$HOME/Imágenes/Webp"

# Revisar que la carpeta existe
mkdir -p "$DIR_VIGILADO"

echo "Vigilando la carpeta: $DIR_VIGILADO"

# Monitorizar la carpeta usando inotifywait
# -m: modo monitor (NO SE DETIENE tras el primer evento que recibe)
# -e close_write: se activa solo cuando un archivo SE TERMINA de escribir ó guardar
# --format: devuelve solo el nombre del archivo

inotifywait -m -e close_write --format '%f' "$DIR_VIGILADO" | while read -r FILE
do
    # Detectar la extensión del archivo (ignoramos mayúsculas/minúsculas)
    EXT="${FILE##*.}"
    EXT_MINUSCULAS=$(echo "$EXT" | tr '[:upper:]' '[:lower:]')
    
    # Evitar bucles infinitos: no procesar si el archivo ya es un .webp
    if [ "$EXT_MINUSCULAS" = "jpg" ] || [ "$EXT_MINUSCULAS" = "jpeg" ] || [ "$EXT_MINUSCULAS" = "png" ]; then
        NOMBRE="${FILE%.*}"
        
        echo "Procesando nueva imagen: $FILE"
        
        # Ejecutar la conversión a webp (calidad 80)
        cwebp -q 80 "$DIR_VIGILADO/$FILE" -o "$DIR_VIGILADO/$NOMBRE.webp"
    fi
done

Paso 3: Dar permisos de ejecución y probar

Le damos permisos de ejecución al script:

chmod +x ~/.local/bin/centinela_dir.sh

Ahora, vamos a ejecutarlo desde la terminal para comprobar si funciona:

~/.local/bin/centinela_dir.sh

Ahora abrimos nuestro gestor de ficheros y vamos a copiar o guarda un archivo .jpg dentro de ~/Imágenes/Webp vemos que en la terminal nos aparece el aviso y se genera el archivo .webp directamente.

Persistencia del script centinela_dir

Si recuerdas los anteriores artículos sobre "Disparadores Linux", se puede iniciar un script o aplicación cada vez que iniciamos sesión:

Disparadores Linux: Sesión gráfica
El disparador Gráfico o AutoStart Si lo que necesitamos es que cuando el usuario inicie sesión en su escritorio gráfico (GNOME, KDE, XFCE) se abra una aplicación, un navegador o se ejecute algún script propio, el estándar a usar son los ficheros .desktop. Cada usuario tiene una carpeta oculta que

Vamos a realizar esto mismo para que nuestro script centinela_dir se inicie y quede trabajando para nosotros, vamos a utilizar las aplicaciones de inicio de XDG Desktop.

Método 1: El método rápido (Línea de comandos)

La especificación XDG busca archivos .desktop dentro de la carpeta ~/.config/autostart.
Si creas un archivo ahí, el sistema lo ejecutará al iniciar sesión.

Solo tienes que copiar y pegar el siguiente bloque de comandos en tu terminal.
Estos comandos crearán el archivo de inicio necesario de forma automática:

mkdir -p ~/.config/autostart

cat << 'EOF' > ~/.config/autostart/centinela_dir.desktop
[Desktop Entry]
Type=Application
Name=Centinela de Directorio para WebP
Comment=Monitoriza la carpeta Imágenes-Webp para convertir imágenes a WebP
Exec=/bin/bash -c "$HOME/.local/bin/centinela_dir.sh"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
EOF

¿Cómo comprobar que funciona?

La próxima vez que reinicies o cierres e inicies sesión, el script se ejecutará en segundo plano de forma invisible.
Puedes verificar que está corriendo con el siguiente comando en tu terminal:

pgrep -fl centinela_dir

Si te devuelve el ID del proceso y la ruta del script, es que está funcionando perfectamente.

Método 2: Usando la interfaz gráfica (GUI)

Si prefieres no tocar los archivos de configuración manualmente, la mayoría de escritorios traen una herramienta visual para poder realizarlo.

Desde el Centro de Control:

  1. Abre el Centro de control de tu gestor gráfico.
  2. En el buscador que suele tener escribe: inicio
  3. Ve a la sección Aplicaciones al inicio.
  4. Haz clic en el botón "+" (Añadir).
  5. Como es un script propio, si no sale en la lista, las herramientas de escritorio te permiten directamente "Añadir script" y tan sólo tienes que seleccionar la ruta ~/.local/bin/centinela_dir.sh

Método 3: systemctl de usuario

¿Y qué pasa si el script falla o se cierra?

El método anterior lanza el script al iniciar, pero si por algún motivo el script da un error (por ejemplo, si recibe un archivo corrupto) se cierra, no se volverá a abrir solo.

Pues aprovechamos nuestro conocimientos de artículos anteriores, y vamos a conseguir un un control absoluto y que el sistema lo reinicie automáticamente si falla, en Debian puedes crear un servicio de usuario con systemd.

Activar y arrancar el servicio:

systemctl --user daemon-reload
systemctl --user enable --now centinela-dir.service

Copia el siguiente contenido:

[Unit]
Description=Centinela de la carpeta Webp

[Service]
Type=simple
ExecStart=/bin/bash %h/.local/bin/centinela_dir.sh
Restart=on-failure

[Install]
WantedBy=default.target

Crea el archivo de servicio de usuario y pega el contenido anterior:

mkdir -p ~/.config/systemd/user/
vi ~/.config/systemd/user/centinela-dir.service

Con systemd, además de iniciar con tu sesión, podrás ver los logs del script en cualquier momento usando:

journalctl --user -u centinela-dir.service -f

Alternativa: Cómo lo haríamos con entr

Si quieres usar entr, el enfoque y solución cambia totalmente.

Como entr necesita recibir la lista exacta de archivos a vigilar, tendrías que usarlo en combinación con find.

Para monitorizar una carpeta y reaccionar a los nuevos archivos con entr, vamos a usar la opción -d (directorio):

while true; do
    find ~/Imágenes/Webp -maxdepth 1 -type f | entr -d -p script_conversion_a_webp.sh
done
Nota: El operador -d hace que entr salga y devuelva un estado si se añade un archivo nuevo al directorio, por lo que se encuentra dentro de un bucle infinito while true para que vuelva a empezar y capture el nuevo archivo.
Por esta razón, inotifywait es mucho más limpio para este caso de uso concreto.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux