Un script shell peut-il attendre qu'un fichier change et prendre des mesures?

12

Je me demande si je peux écrire un script qui surveillera une modification dans un fichier et exécutera une action lorsque la modification est détectée.

Explication détaillée:

  1. OpenVPN écrit son état dans un fichier toutes les 1 minute.
  2. J'ai besoin d'analyser ce fichier d'état et de prendre des mesures.
  3. OpenVPN tronque le fichier d'état avant d'y écrire.
  4. J'ai essayé d'écrire dans un canal nommé, mais j'obtiens des erreurs indésirables (mais pas fatales) dans l'application lorsqu'elle ne parvient pas à tronquer le canal.
davidparks21
la source
Dans le cas où la modification est réellement ajoutée au fichier, le maintien tail -fest probablement le moyen le plus simple. Mais seulement pour l'ajout.
SF.

Réponses:

21

Pas cher et sale:

Bouclez stat -c %Y fileet agissez lorsque l'heure de modification change.

Probablement mieux:

Utilisez le service inotify cron pour surveiller les événements de modification de fichier et exécuter votre action:

/path/to/your/file IN_MODIFY /path/to/your/script $#
Cakemox
la source
+1 pour la deuxième solution
Michael Lowman
2

inotify serait la bonne façon de le faire. Des didacticiels sont donnés dans certaines éditions du magazine LinuxForYou pour cette même question.

Suhail Sherif
la source
0

Ayez donc un script qui:

1) Vérifie l'heure de modification sur le fichier (avec stat)
2) Si l'heure de modification est plus récente que lors de la dernière vérification, elle a changé
3) Analysez-la et effectuez votre action
4) Sinon, dormez 1 minute puis relancez

Rafiq Maniar
la source
0

Manière rapide et sale:

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

wait_file_changed /tmp/potato
dctremblay
la source