Chciałbym demonizator, który może zamienić dowolny, ogólny skrypt lub polecenie w demona .
Są dwa typowe przypadki, którymi chciałbym się zająć:
Mam skrypt, który powinien działać wiecznie. Jeśli kiedykolwiek umrze (lub przy ponownym uruchomieniu), uruchom go ponownie. Nie pozwól, aby dwie kopie działały jednocześnie (sprawdź, czy kopia już działa i nie uruchamiaj jej w takim przypadku).
Mam prosty skrypt lub polecenie wiersza poleceń, które chciałbym wykonywać wielokrotnie w nieskończoność (z krótką przerwą między uruchomieniami). Ponownie, nie pozwól, aby dwie kopie skryptu działały jednocześnie.
Oczywiście to trywialne jest napisanie pętli "while (prawda)" wokół skryptu w przypadku 2, a następnie zastosowanie rozwiązania dla przypadku 1, ale bardziej ogólne rozwiązanie po prostu rozwiąże bezpośrednio przypadek 2, ponieważ dotyczy to skryptu w przypadku 1 jako dobrze (być może po prostu nie krótszy lub pauzy, jeśli skrypt nie ma nigdy umrzeć (oczywiście jeśli skrypt naprawdę nie nigdy nie umierają wtedy pauza nie faktycznie sprawa)).
Zwróć uwagę, że rozwiązanie nie powinno obejmować, powiedzmy, dodawania kodu blokującego pliki lub nagrywania PID do istniejących skryptów.
Dokładniej, chciałbym program "demonizujący", który mógłbym uruchomić
% daemonize myscript arg1 arg2
lub na przykład
% daemonize 'echo `date` >> /tmp/times.txt'
co pozwoliłoby na utrzymanie rosnącej listy dat dołączanych do times.txt. (Zauważ, że jeśli argumentem (argumentami) do demonizacji jest skrypt, który działa wiecznie, jak w przypadku 1 powyżej, wtedy daemonize nadal będzie działać właściwie, uruchamiając go ponownie w razie potrzeby.) Mogę wtedy umieścić polecenie jak powyżej w moim .login i / lub cron go co godzinę lub co minutę (w zależności od tego, jak bardzo się martwiłem, że to nieoczekiwanie umrze).
NB: Skrypt daemonize będzie musiał zapamiętać ciąg poleceń, które demonizuje, aby w przypadku ponownego zdemonizowania tego samego ciągu poleceń nie uruchamiał drugiej kopii.
Ponadto rozwiązanie powinno idealnie działać zarówno na OS X, jak i na Linuksie, ale rozwiązania dla jednego lub drugiego są mile widziane.
EDYCJA: W porządku, jeśli musisz go wywołać sudo daemonize myscript myargs
.
(Jeśli myślę o tym źle lub są szybkie i brudne rozwiązania częściowe, też chciałbym to usłyszeć.)
PS: Na wypadek, gdyby było to przydatne, oto podobne pytanie dotyczące Pythona.
A ta odpowiedź na podobne pytanie ma coś, co wydaje się być użytecznym idiomem do szybkiej i brudnej demonizacji dowolnego scenariusza: