Czy istnieje sposób na ustawienie wyzwalacza w pliku, aby za każdym razem, gdy plik był zmieniany, skrypt lub program był uruchamiany?
Znalazłem tylko ten mechanizm w skrypcie powłoki, ale chciałbym wiedzieć, czy istnieje taki mechanizm w systemie operacyjnym (aby nie musiałem ręcznie uruchamiać programu działającego w tle). Rozwiązaniem opartym na systemie operacyjnym byłoby zadanie cron uruchamiane co kilka sekund, ale nie wydaje mi się to odpowiednim rozwiązaniem.
To jest dla Debiana, btw.
Dzięki za pomoc.
Innym szybkim i brudnym sposobem na to jest użycie
inotifywait
pakietu inotify-tools (na fedorze).Bardziej podoba mi się ta metoda, ponieważ możesz to wszystko zrobić z jednego wiersza poleceń bash. Często używam tego, gdy piszę małe programy, aby zobaczyć wyniki tego, co właśnie zapisałem.
źródło
Argumentowałbym, że mechanizm tego w skrypcie powłoki jest rozwiązaniem całkowicie adekwatnym i że mechanizm oparty na systemie operacyjnym (aby nie musiałem ręcznie uruchamiać programu działającego w tle) oznacza po prostu umieszczenie tego rozwiązania w procesie manager jak s6 , runit , jednostka systemowa , a nawet wpis inittab, jeśli korzystasz z systemu sysvinit.
Niezależnie od mechanizmu utrzymywania go, lubię entr do oglądania plików. Prosty do rzeczy, łatwy do skomponowania (np. Trywialny w menedżerze procesów).
Oto skrypt do oglądania
/path/to/file
i uruchamiania,/usr/local/bin/do_stuff
gdy się zmienia:To wszystko. Umieść to w
run
pliku runit lub s6, umieść wExecStart
wierszu jednostki systemowej lub wywołaj ten skrypt z linii winittab
. Chociaż jeśli go włożyszinittab
, prawdopodobnie chcesz cośsleep
gdzieś dodać , ponieważ sysvinit nie ogranicza procesów, które kończą się niepowodzeniem natychmiast z powodu błędów ortograficznych, brakujących plików itp.Dlaczego nie tylko
echo /path/to/file | entr /usr/local/bin/do_stuff
? Podczas zarządzania procesem ważne jest, aby zarządzany proces znajdował się bezpośrednio pod zwierzchnikiem, tak aby zachowywał się poprawnie przy wyłączeniu. Jeśli powłoka działa pod przełożonego, powłoka złapie każdyTERM
,INT
czyKILL
sygnały raczej niż proces jest uruchomiony, a to nie będzie przekazać je dalej. Lub zakończy działanie i pozostawi proces osierocony.exec
usuwa powłokę z łańcucha procesu. (exec
po prawej stronie|
nie ma znaczenia)Lub po prostu użyj powłoki, która nigdy nie stawia się na środku, wykonaj :
źródło