Czy skrypt powłoki może czekać na zmianę pliku i podjąć działanie?

12

Zastanawiam się, czy mogę napisać skrypt, który będzie monitorował zmianę w pliku i wykonał jakieś działanie po wykryciu zmiany.

Szczegółowe wyjaśnienie:

  1. OpenVPN zapisuje swój status do pliku co 1 minutę.
  2. Muszę przeanalizować ten plik statusu i podjąć działanie.
  3. OpenVPN obcina plik statusu przed zapisaniem do niego.
  4. Próbowałem pisać do nazwanego potoku, ale dostaję niepożądane (ale nie śmiertelne) błędy w aplikacji, gdy nie może on obciąć potoku.
davidparks21
źródło
W przypadku, gdy modyfikacja faktycznie dołącza się do pliku, zawieszenie się tail -fjest prawdopodobnie najłatwiejszym sposobem. Ale tylko do dołączania.
SF.

Odpowiedzi:

21

Tanie i brudny sposób:

Zapętlaj stat -c %Y filei podejmuj działania, gdy zmieni się czas modyfikacji.

Prawdopodobnie lepiej:

Użyj usługi cron inotify, aby obserwować zdarzenia modyfikacji plików i uruchomić akcję:

/path/to/your/file IN_MODIFY /path/to/your/script $#
Cakemox
źródło
+1 za drugie rozwiązanie
Michael Lowman,
2

Inotify byłby właściwym sposobem na zrobienie tego. Samouczki w tym wydaniu magazynu LinuxForYou dotyczące tego właśnie pytania.

Suhail Sherif
źródło
0

Więc miej skrypt, który:

1) Sprawdza czas modyfikacji pliku (ze stat)
2) Jeśli czas modyfikacji jest nowszy niż ostatnio sprawdzony, to się zmienił
3) Analizuj go i wykonuj swoje działanie
4) W przeciwnym razie śpij przez 1 minutę, a następnie uruchom ponownie

Rafiq Maniar
źródło
0

Szybki i brudny sposób:

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

wait_file_changed /tmp/potato
dctremblay
źródło