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/filei uruchamiania, /usr/local/bin/do_stuffgdy się zmienia:
#!/bin/bash
exec entr /usr/local/bin/do_stuff < <(echo /path/to/file)
To wszystko. Umieść to w runpliku runit lub s6, umieść w ExecStartwierszu jednostki systemowej lub wywołaj ten skrypt z linii w inittab. Chociaż jeśli go włożysz inittab, prawdopodobnie chcesz coś sleepgdzieś 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, INTczy KILLsygnały raczej niż proces jest uruchomiony, a to nie będzie przekazać je dalej. Lub zakończy działanie i pozostawi proces osierocony. execusuwa powłokę z łańcucha procesu. ( execpo 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