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.

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 $#

+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.


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


0

Manière rapide et sale:

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

wait_file_changed /tmp/potato
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.