Chcę automatycznie uruchamiać skrypt za każdym razem, gdy nowe pliki są kopiowane do określonego katalogu. Innymi słowy, czy jest sposób w Linuksie, aby „obserwować” katalog zmian, a następnie uruchomić coś w odpowiedzi na zmianę?
17
Odpowiedzi:
Jeśli masz szczęście wystarczy być na dystrybucji Debiana opartej
apt-get install dnotify
. Inne dystrybucje prawdopodobnie mają coś podobnego - poszukajdnotify
nazwy.Jeśli chcesz poradzić sobie z tym w swoim własnym programie, dnotify to także interfejs API, którego chcesz użyć.
źródło
emerge inotify-tools
Możesz uruchomić skrypt za pomocą narzędzi inotify, coś takiego. Będzie obserwował katalog pod kątem zmian w zmodyfikowanych plikach, nowych i usuniętych plikach, a następnie wykona skrypt.
źródło
myślę, że incron jest w zasadzie tym, czego chcesz. Używa inotify jako mechanizmu powiadamiania (który, jak zauważyli inni, zastępuje dnotify), ale nie wymaga skryptu, który działa w sposób ciągły, używając inotifywait lub podobnego (choć oczywiście demon incron cały czas działa). Ogólnosystemowe „crontabs” i „crontabs” użytkownika są obsługiwane w podobny sposób jak standardowy cron, ale zamiast określania czasów jako wyzwalaczy, używane są zdarzenia inotify oraz nazwy plików / katalogów.
incron jest spakowany dla wielu dystrybucji, w tym, jak sądzę, Ubuntu i Debian.
źródło
Istnieje oprogramowanie przeznaczone wyłącznie do tego celu, autoenv Możesz to sprawdzić.
źródło
entr jest najprostszym i najbardziej składalnym narzędziem do powiadamiania o plikach, jakie widziałem. Jego użycie jest zoptymalizowane do oglądania plików, a nie katalogów, ale może również rozwiązać twoją sprawę.
Aby wykryć i działać na dodanym pliku, połącz go z innymi narzędziami, takimi jak np
make
.entr
nie wysyła nazwy ani nic podobnego, po prostu uruchamia to, co kazałeś uruchomić.Aby sprawdzić dodane pliki w katalogu:
Jeśli chcesz działać również w przypadku zmiany istniejącego pliku:
... i tu przydaje się mechanizm pętli, ponieważ
find
wyrażenie zostanie uruchomione ponownie, jeśli plik zostanie dodany.Jeśli chcesz poprawić obsługę błędów i upewnić się, że wszystko działa tylko raz dla dodanego / usuniętego pliku, robi się nieco dziwacznie, ale w tych prostych przypadkach jest genialny.
EDYCJA: Jeśli chcesz to zrobić na poziomie systemu, na przykład incron , po prostu dodaj skrypt do swojego ulubionego menedżera procesów (takiego jak s6 , runit , systemd lub sysvinit i pomiń pętlę:
Funkcje
exec
oraz proces podstawiania (<(...)
) są ważne podczas uruchamiania z menedżera procesów, aby poprawnie obsługiwać sygnalizację (tj. Aby usunąć powłokę z drogi).źródło