Detecta continuamente nuevos archivos con inotify-tools dentro de múltiples directorios de forma recursiva

17

Acabo de instalar inotify-tools. Me gustaría detectar continuamente nuevos archivos con herramientas de notificación dentro de múltiples directorios de forma recursiva y enviar un correo electrónico usando postfix. Probablemente pueda manejar el envío de un correo electrónico usando la parte de postfix. Solo estoy tratando de descubrir la mejor manera de hacer esto cuando trato de detectar nuevos archivos. Porque a veces se agregan varios archivos a la vez.

David Custer
fuente

Respuestas:

39

inotifywait (parte de inotify-tools ) es la herramienta adecuada para lograr su objetivo, no importa que se estén creando varios archivos al mismo tiempo, los detectará.

Aquí un script de muestra:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done

inotifywait usará estas opciones.

-m para monitorear el directorio indefinidamente, si no usa esta opción, una vez que haya detectado un nuevo archivo, el script finalizará.

-r supervisará los archivos de forma recursiva (si hay muchos directorios / archivos, podría tomar un tiempo detectar los nuevos archivos creados)

-e create es la opción para especificar el evento a monitorear y en su caso debe crearse para cuidar los nuevos archivos

--format '% w% f' imprimirá el archivo en el formato /complete/path/file.name

"$ {MONITORDIR}" es la variable que contiene la ruta para monitorear que hemos definido antes.

Entonces, en el caso de que se cree un nuevo archivo, inotifywait lo detectará e imprimirá la salida (/complete/path/file.name) en la tubería y, al mismo tiempo, asignará esa salida a la variable NEWFILE .

Dentro del ciclo while verá una forma de enviar un correo a su dirección utilizando la utilidad mailx que debería funcionar bien con su MTA local (en su caso, Postfix).

Si desea monitorear varios directorios, inotifywait no lo permite, pero tiene dos opciones: crear un script para cada directorio para monitorear o crear una función dentro del script, algo como esto:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &
sahsanu
fuente
Olvidé agregar varias explicaciones con respecto a los comandos utilizados en el script de muestra, esa es la razón para editar mi respuesta ... También agregué el script en caso de que op quiera monitorear varios directorios. Con respecto a la herramienta inotifywait, es imposible responder la pregunta sin mencionarla porque op está usando inotify-tools. Por cierto, soy un novato aquí, así que necesito aprender mucho sobre netiquette, así que, perdón si mi respuesta se superpone a la tuya, no era lo que quería, solo quiero dar una respuesta completa a la operación. Lo siento, nuevamente.
sahsanu
No hay problema y bienvenido a SU. Aprender acerca de la netiqueta generalmente se hace de la manera difícil, ya que en realidad no está definido en ninguna parte.
harrymc
44
@sahsanu No estoy de acuerdo con todo el asunto de la "netiqueta". Cada persona responde la pregunta desde su propia perspectiva. No hay superposición entre las respuestas, ni hay una respuesta que se haya reescrito. Es imposible que las respuestas difieran de esa manera cuando la pregunta es tan específica. Muchas gracias por tomarse el tiempo para responder la pregunta con gran detalle. Esto ha ayudado más de lo que sabes, para alguien como yo que está aprendiendo todo esto. Me has salvado incontables horas.
David Custer
1
@harrymc Netiquetta se define aquí.
David Custer
Netiquette en un entorno en evolución no se puede definir absolutamente. Es habitual en este sitio no duplicar las respuestas a menos que estén mal escritas, y aun así se recomienda corregirlas mediante la edición. Siempre tiene derecho en una comunidad democrática a no estar de acuerdo. @sahsanu podría haber evitado mi comentario al referirse a mi respuesta anterior mientras mostraba su guión, lo que habría obtenido su aprobación en cualquier caso. Eso es lo que hubiera hecho en su lugar y esa es mi netiquette, que creo que comparto con otros (pero no con todos, por supuesto).
harrymc
8

Use inotifywait , por ejemplo:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Para obtener más información y ejemplos, consulte el artículo
Cómo usar inotify-tools para activar scripts en eventos del sistema de archivos .

harrymc
fuente
1
Si alguien usa esto y convierte las variables de la lectura en mayúsculas, no podrá ejecutar algunos comandos dentro del tiempo. Esto se debe a que sobrescribiría la variable $ PATH.
Savageman
2
@Savageman El uso de nombres de variables en mayúsculas para sus propias variables está fuertemente desalentado precisamente por esta razón. Los nombres de variables en mayúscula están reservados para uso del sistema; sus propias variables deben usar minúsculas.
tripleee
@tripleee Gracias por la información, ya no usaré mayúsculas mayúsculas :)
Savageman
0

Para varios directorios puede hacer esto:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
  done
          }


monitor &

Aquí hay una lista de ejemplos de carpetas en el archivo /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Konstantin Frank
fuente