Saltar al contenido

Script de bash para monitorear el cambio de archivo y ejecutar el comando

Hemos buscando en el mundo on line y así darte la respuesta a tu problema, si continúas con inquietudes puedes dejar tu pregunta y te contestamos porque estamos para ayudarte.

Solución:

Linux proporciona una interfaz agradable para monitorear todos los eventos del sistema de archivos, como crear, modificar y eliminar archivos. La interfaz es inotify familia de llamadas al sistema, las utilidades del espacio de usuario que aprovechan estas llamadas son proporcionadas por el inotify-tools paquete en Ubuntu (disponible en el repositorio de universos). Si aún no lo tiene, instálelo mediante:

sudo apt-get install inotify-tools

inotify-tools proporciona inotifywait y inotifywatch binarios, necesitamos el primero.


Entonces quieres ejecutar el comando asciidoctor -q some_file cuando alguno .adoc el archivo está modificadosome_file será reemplazado por eso), si es así, asumiendo su .adoc los archivos están en el directorio /foo/bar, puede configurar el reloj:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -q habilita el modo silencioso, no hay información de inotifywait sí mismo

  • -m habilita el modo monitor; de lo contrario, saldrá después del primer evento

  • --event modify, solo estamos interesados ​​en modify evento, es decir, cuando se modifica un archivo. Otros valores posibles incluyen open, close etc.

  • --format %w, solo queremos el nombre del archivo que se modifica en lugar de un montón de otra información, ya que usaremos el nombre del archivo como entrada para otro comando

  • /foo/bar/*.adoc se expandirá a todos .adoc archivos bajo /foo/bar directorio


Ahora lo anterior le mostrará el nombre del archivo siempre que se modifique alguno, ahora para ejecutar el comando en el nombre del archivo (asumiendo que el comando toma argumentos a través de STDIN):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

También puede configurar una vigilancia recursiva en el directorio, luego deberá usar grep para filtrar solo los archivos deseados. Aquí configurando el reloj de forma recursiva (-r) en el directorio /foo/bar y usando grep para filtrar solo .adoc archivos:

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '.adoc$' | asciidoctor -q

Al mirar directorios, el especificador de formato de salida %w se resuelve en el nombre del directorio, por lo que necesitamos %f para obtener el nombre del archivo. Mientras mira archivos, %f resolvería vaciar string.

Tenga en cuenta que también puede ejecutar inotifywait en demonio-d), también puede crear un script para todo, y / o ejecutarlo en segundo plano, y / o jugar con otras opciones.

Además, puede reemplazar asciidoctor con cualquier otro comando de su elección, si lo desea.

Cheque man inotifywait para tener más idea.

Utilizando inotifywait es el enfoque típico, pero también hay una utilidad separada llamada inotify-hookable que solo le permite ejecutar un comando cuando cambia un archivo (o directorio):

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

Parece salir después de activar el comando una vez; No veo una opción para la visualización continua, por lo que podría hacer algo como:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

Tenga en cuenta que hay opciones para monitorear varios archivos o un directorio, de forma recursiva, y opciones para ignorar archivos / rutas.

Existen muchas herramientas, especialmente si busca en su repositorio

apt-cache search monitor | grep file

lo que nos da muchas herramientas. Pero no tienes que probarlos porque yo hice eso.

He probado estas herramientas y muchas otras:

  • inotificar
  • fswatch
  • reloj de archivo
  • muestra de tela
  • archivos cambiados
  • entr

Entre estas herramientas, encontré tres útiles y confiables:

  • direvent | GNU escrito en C
  • iwatch | en Perl
  • francotirador

Y de estos tres, sin duda el peor es el mejor.

Es tan útil y confiable de usar que lo he usado para un simple tubería con mis microservicios que tengo.

direvent.conf archivo para ver

syslog 
    facility local0;
    tag "direvent";
    print-priority yes;


watcher 
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);

Este es solo uno de los archivos de configuración que tengo en el que siempre que hay un cambio para escribir luego se ejecuta este comando, que también podría ser un script bash.

No es necesario usar while bucle u otras cosas.


características

  • viendo un directorio de forma recursiva
  • se puede ejecutar en primer plano o antecedentes como un demonio
  • portátil. Lo tengo en Ubuntu y en el servidor CentOS7
  • informe de nombre de archivo
  • expresiones regulares para admitir la coincidencia de archivos
  • visualización de archivos múltiples (ver más de un solo tipo de archivo)
  • sincronizar la ejecución de los comandos (si tenemos un observador múltiple)
  • Manejo de syslog (iniciar sesión en syslog si queremos)
  • diseño de archivo de configuración y CLI fácil y bueno para trabajar

Desarrollado por Sergey Poznyakoff.


Instalando

sudo apt install direvent

Pero instalarlo usando su código fuente es bastante fácil y directo, lo que le brinda la última versión (ahora mismo es: 5.1).

  • descargar
  • documento
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *