¿Puede un script de shell esperar a que cambie un archivo y tomar medidas?

12

Me pregunto si puedo escribir un script que monitoreará un cambio en un archivo y ejecutará alguna acción cuando se detecte el cambio.

Explicación detallada:

  1. OpenVPN escribe su estado en un archivo cada 1 minuto.
  2. Necesito analizar este archivo de estado y tomar medidas.
  3. OpenVPN trunca el archivo de estado antes de escribir en él.
  4. Intenté escribir en una tubería con nombre, pero recibo errores indeseables (pero no fatales) en la aplicación cuando no se puede truncar la tubería.
davidparks21
fuente
En caso de que la modificación realmente se agregue al archivo, tail -fprobablemente la forma más fácil sea aferrarse. Pero solo por anexar.
SF.

Respuestas:

21

Barato y sucio:

Haga un bucle stat -c %Y filey tome medidas cuando cambie el tiempo de modificación.

Probablemente mejor:

Use el servicio cron de inotify para ver los eventos de modificación de archivos y ejecutar su acción:

/path/to/your/file IN_MODIFY /path/to/your/script $#
Cakemox
fuente
+1 para la segunda solución
Michael Lowman
2

inotify sería la forma correcta de hacerlo. En esta edición de la revista LinuxForYou se ofrecen tutoriales para esta misma pregunta.

Suhail Sherif
fuente
0

Entonces tenga un script que:

1) Comprueba el tiempo de modificación en el archivo (con stat)
2) Si el tiempo de modificación es más nuevo que la última vez que lo verificó, ha cambiado
3) Analícelo y realice su acción
4) De lo contrario, duerma durante 1 minuto y luego vuelva a colocar

Rafiq Maniar
fuente
0

Manera rápida y sucia:

function wait_file_changed {
    tail -fn0 "$1" | head -n1
}

wait_file_changed /tmp/potato
dctremblay
fuente