Ya he publicado varios artículos en los que hago uso de inotify-tools
para poner en marcha diferentes automatizaciones. Así por ejemplo puedes leer sobre esta herramienta en este artículo sobre sincronización bidireccional, o escucharme en el podcast sobre google drive en la Raspberry. Sin embargo, hasta el momento, no le he dedicado ningún artículo a esta poderosa herramienta de automatización. Así, en este artículo vas a poder leer sobre inotify-tools y que puedes hacer con esta herramienta para mejorar tu productividad y aumentar la automatización de procesos.
Pero, en pocas palabras, y sin irme por las ramas ¿que es inotify-tools? Una herramienta que te va a permitir vigilar lo que sucede en tu sistema de archivos y actuar ante determinados eventos. Por ejemplo, que se cree un archivo nuevo en un directorio, o que modifique un archivo, etc. Cualquiera de estas acciones generará un evento, ante el cual, tu podrás tomar acciones. Así que ya puedes ver el increíble potencial de esta herramienta…
inotify-tools
inotify-tools es una librería implementada en C por Rohan McGovern y mantenida actualmente por Radu Voicilas. Se trata de un conjunto de programas para utilizarlos en el terminal. Y no son, ni mas ni menos, que un interfaz para inotify.
Sonbre inotify
Inotify (inode notify) es un subsistema del núcleo de Linux que actúa extendiendo el sistema de archivos de forma que se notifique cualquier cambio que se produzca en el mismo, y además informando a otras aplicaciones sobre esos cambios.
Inotify fue creado por John McCutchan, y comenzó a formar parte del núcleo de Linux en la versión 2.6.13, que fue liberado en Agosto de 2015.
La gran ventaja o utilidad de Inotify es que se puede utilizar para actualizar la vista de directorios, recargar archivos de configuración, registrar cambios en logs, realizar copias de seguridad, sincronizaciones y cargas.
Esta herramienta es perfecta para automatizar todos tus procesos relativos al sistema de archivos.
Instalando inotify-tools
inotify-tools se encuentra en los repositorios oficiales de Ubuntu, y por supuesto de muchas otras distribuciones. Por ello, su instalación es tan sencilla como ejecutar,
sudo apt install inotify-tools
Sobre la herramienta
inotify-tools consiste en básicamente en tres elementos,
libinotifytools
, que es una libraría que proporciona una delgada capa situada sobre la interfaz de inotify. El uso principal de esta librería es el de facilitar el trabajo con inotify estableciendo monitorización sobre archivos y lectura de eventos sin que sea necesario trabajar a muy bajo nivel.inotifywait
este comando simplemente bloquea la ejecución a la espera de eventos, haciéndolo ideal para su utilización en scripts. Esta es precisamente una de las características que tanto me atraen de esta herramienta, y es que utilizándola en combinación con el tutorial de scripts en Bash, le puedes sacar, realmente, mucho potencial. No solo esto, sino que además te permite monitorizar directorios o directorios de directorios o directorios de directorios de directorios o…. completos, de forma que puedes estar perfectamente informado de lo que está ocurriendo y en caso de necesidad actuar de forma completamente automatizada.inotifywatch
se encarga re recoger estadísticas de uso de tu sistema de archivos. Así tu puedes establecer un tiempo de monitorización, al final del cualinotifywatch
te mostrará esas estadísticas de uso.
Algunos ejemplos
Inotifywait
Este primer ejemplo ya lo he expuesto en alguna que otra ocasión, pero me parece muy descriptivo de las posibilidades de esta herramienta. Simplemente se trata de monitorizar un directorio. En el caso de que se cree un nuevo archivo en ese directorio con formato JPG
, este lo convierte a PNG
.
#!/bin/bash
while inotifywait -e create --format "*.jpg" --timefmt %d-%m-%Y ~/imagenes >> out.log 2>&1
do
for i in ~/imagenes/*.jpg
do
png=${i/.jpg/.png}
if [ ! -e "$png" ];then
convert $i $png
fi
done
done
Por supuesto que al igual que lo haces con imágenes, también lo puedes hacer con vídeo. Así, si descargas algún vídeo de YouTube a un directorio que lo tengas monitorizado con inotifywait
, este se convertirá directamente a mp3. Por ejemplo,
#!/bin/bash
while inotifywait -e create --format "*.mp4" --timefmt %d-%m-%Y ~/descargas >> out.log 2>&1
do
for i in ~/descargas/*.mp4
do
mp3=${i/.mp4/.mp3}
if [ ! -e "$mp3" ];then
ffmpeg -i $i -f mp3 -ab 192000 -vn $mp3
fi
done
done
Aquí solo pone límite tu imaginación para automatizar o monitorizar cualquier proceso que consideres. Así, por ejemplo, si lo que quieres es saber si alguien escribe en un directorio, y estar continuamente informado, lo puedes hacer. Para ello, puedes enviarte un mensaje de Telegram a un chat, cada vez que se haga cualquier modificación. Para esto, haciendo uso del artículo de Ángel en uGeek sobre crear un bot de Telegram con Bash y en una sola línea, puedes hacer un script como el que te muestro a continuación,
#!/bin/bash
while inotifywait -e create --format "*.mp4" --timefmt %d-%m-%Y ~/Descargas >> out.log 2>&1
do
curl -s -X POST https://api.telegram.org/bot"30534591:AAH5d23KtktfTQSWJMT9CiuginbsFQiF_2nB4"/sendMessage -d chat_id="57384545" -d text="Archivo creado"
done
Evidentemente tienes que modificar tanto el token utilizado como el identificador del chat al que envias el mensaje. Mas que nada por si todos estamos utilizando el mensaje al chat privado de Ángel 😉.
inotifywatch
Como te indicaba anteriormente inotifywatch
te permite obtener estadísticas de uso de un determinado archivo o directorio durante un período de tiempo a indicar por ti.
Así, por ejemplo, he monitorizado durante sesenta segundos lo que se produce en mi directorio de artículos de 2019. Aunque, solo para algunos eventos. Así, el resultado es el siguiente,
$ inotifywatch -v -e access -e modify -t 60 -r /datos/Sync/atareao.es/articulos/2019
Establishing watches...
Setting up watch(es) on /datos/Sync/atareao.es/articulos/2019
OK, /datos/Sync/atareao.es/articulos/2019 is now being watched.
Total of 45 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total access modify filename
88 88 0 /datos/Sync/atareao.es/articulos/2019/
13 3 10 /datos/Sync/atareao.es/articulos/2019/45 - inotify/
2 2 0 /datos/Sync/atareao.es/articulos/2019/11 - Station/
Esto te permite hacerte una idea de las posibilidades de esta herramienta, en lo que a monitorización se refiere.
Conclusión
Esto solo es la punta del iceberg de todo lo que puedes hacer con esta herramienta. Aquí, como te digo en mas de una ocasión, solo le pone límite tu imaginación, y las muchas o pocas ganas que puedas tener de probar y experimentar. Como te digo, combinado con el tutorial de scripts en Bash, esto es una fuente inagotable de diversión, entretenimiento y sobre todo mucha productividad.
Más informacióón
Imagen de portada de Maksym Kaharlytskyi en Unsplash
Hola, a ver si me puedes ayudarme necesitaría un script que monitorice cuando cambia un archivo, concretamente /home/yeti/.config/quodlibet/current y que cuando ese archivo cambia se ejecute un script o simplemente el comando
quodlibet –print-playing ‘ – ‘> sonando.txt
Te agradezco mucho si puedes darme una mano con eso.
Saludos
Es tan sencillo como,
while inotifywait -e modify «archivo_a_monitorizar» >> out.log 2>&1
do
comando_a_ejecutar
done
Hola Lorenzo,
Un gusto saludarte, hace ya tiempo sigo tus videos en youtube y algunas de tus publicaciones.
Esta publicación en concreto me viene como anillo al dedo por la necesidad de monitorear un folder ó directorio donde deben guardarse documentos con extension .odt de libreoffice write, siguiendo tus videos de bash he conseguido hacer una script que le da tratamiento a dichos archivos uno a la vez para generar uno nuevo en txt pre-formateado para una impresora raw.
La idea es que cada vez que se coloque ya sea creado, copiado ó movido un .odt allí, se ejecute dicha función, limpie el directorio y ese hotfolder quede a la espera de un nuevo archivo para procesar.
He intentado hacerlo modificando tu script, pero no doy pie con bola, agradecería me ayudaras con eso si esta a tu alcance.
Saludos y gracias de antemano
Ya logre solucionar, solo necesitaba ver detenidamente el codigo y entenderlo:
#!/bin/bash
source «~/prueba/sh/inicio.sh» # Contenedor de función de formato a txt y procesado de lineas
while inotifywait -e create –format «*.odt» –timefmt %d-%m-%Y «~/prueba/imprimir» >> «~/prueba/log/out.log» 2>&1
do
for i in «~/prueba/imprimir/*.odt»
do
odt=${i/.odt}
if [ ! -e «$odt» ];then
funcini ### Función llamada al colocar los .odt
fi
done
done