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:
#!/bin/bash
exec entr /usr/local/bin/do_stuff < <(echo /path/to/file)
To wszystko. Umieść to w run
pliku runit lub s6, umieść w ExecStart
wierszu jednostki systemowej lub wywołaj ten skrypt z linii w inittab
. Chociaż jeśli go włożysz inittab
, 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żdy TERM
, INT
czy KILL
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 :
#!/bin/execlineb
pipeline -d {
echo /path/to/file
} entr /usr/local/bin/do_stuff