Jak uruchomić polecenie, gdy zawartość katalogu jest aktualizowana?

27

Istnieje katalog, Aktórego zawartość jest często zmieniana przez inne osoby.

Stworzyłem osobisty katalog, w Bktórym przechowuję wszystkie pliki, w których kiedykolwiek byłem A.

Obecnie po prostu od czasu rsyncdo czasu uruchamiam pliki, których kopie zapasowe należy Awykonać B. Jednak obawiam się, że niektóre pliki zostaną dodane A, a następnie usunięte, Azanim dostanę szansę na skopiowanie ich B.

Jaki jest najlepszy sposób, aby temu zapobiec? Idealnie byłoby, gdyby mój bieżący skrypt kopii zapasowej był uruchamiany za każdym razem, gdy Azmienia się zawartość .

oadams
źródło

Odpowiedzi:

29

Jeśli masz zainstalowane narzędzia inotify , możesz użyć inotifywaitdo uruchomienia akcji, jeśli plik lub katalog jest zapisany w:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Gdy -qqprzełącznik jest całkowicie cichy, -rjest rekurencyjny (w razie potrzeby) i -ejest zdarzeniem do monitorowania, w tym przypadku modify. Od man inotifywait:

modyfikuj
Obserwowany plik lub plik w obserwowanym katalogu został zapisany.
jasonwryan
źródło
5
incrondmoże również być interesujące.
Shawn J. Goff,
1
Fajne. Czy po prostu umieściłbym powyższy skrypt w moim bashrc, aby działał podczas logowania? Czy jest inny sposób, aby cały czas działał?
oadams,
W przypadku logowania tak /etc/profiledla całego systemu lub .bash_profiletylko dla użytkownika. Aby uruchomić go po uruchomieniu, zależy to od Twojego gustu w systemach Unix / Linux; /etc/rc.local, /etc/rc.d/lub/etc/init.d/
jasonwryan
1
W przypadku większych katalogów warto rozważyć użycie --monitorprzełącznika (i zamiast tego przesłać wyjście do pętli), w przeciwnym razie istnieje duże obciążenie, gdy inotifywaitjest uruchamiany w kółko
Tobias Kienzler
Jak niezawodnie działałoby to rozwiązanie, aby uruchomić skrypt dla każdego pliku dodanego do drzewa katalogów za pośrednictwem serwera FTP (powiedzmy, że nowy plik jest dodawany średnio co 3 minuty i może trwać przez lata)? Jeśli nie bardzo, czy istnieje alternatywne rozwiązanie?
Nikola Novak,
5

Ściśle mówiąc, jeśli ktoś upuści plik i bardzo szybko go usunie, możesz go przegapić. Zastosowanie inotify (pod Linuksem lub podobnej funkcji pod innymi jednorożcami) sprawia, że ​​okno ryzyka jest niewielkie.

Jeśli możesz zamontować wybrany system plików w tym katalogu (zdaję sobie sprawę, że może to nie być opcja), możesz umieścić taki, który rejestruje wszystkie wersje plików, na przykład copyfs .

Gilles „SO- przestań być zły”
źródło
4

Wypróbuj entrnarzędzie wiersza polecenia, które może uruchamiać dowolne polecenia w przypadku zmiany plików. Od wydania 2.9 dodano opcję przeglądania katalogów ( -d), aby reagować na zdarzenia po dodaniu nowego pliku do katalogu.

Przykład uruchomienia narzędzia, jeśli do projektu dodano nowy plik:

$ while true; do
> echo src/* | entr -d your_command
> done

W trybie przeglądania katalogów katalog macierzysty każdego pliku jest domyślnie dodawany do listy obserwowanych.

Jedyną tego konsekwencją jest to, że jeśli pojawi się nowy plik, musi wyjść, aby umożliwić zewnętrznej pętli powłoki ponowne skanowanie systemu plików.

Oto wersja bez opcji oglądania katalogu:

$ while true; do
> echo src/* src | entr your_command
> done

Oto prostszy przykład w zależności od potrzeb:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Sprawdź: strona internetowa entrproject.org, aby uzyskać więcej informacji.

kenorb
źródło
3

Program, którego szukasz inotify.

Kevin
źródło