Odczyt z potoku, zapis do pliku
Jeśli chcesz, aby demon odczytał dane wygenerowane przez dowolny dowolny proces, musisz podłączyć ten proces do potoku. Tutaj arbitralny proces polega na powtarzaniu poleceń i będzie przebiegał w innym kontekście. Stwórz więc nazwany potok (często nazywany fifo w kontekstach unixowych).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
I po prostu napisz polecenia do potoku:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Jest jednak mało prawdopodobne, aby działało tak, jak jest: istnieje duża szansa, że demon zakończy działanie, gdy zobaczy koniec pliku na standardowym wejściu, co nastąpi natychmiast po zakończeniu pierwszego procesu zapisywania w potoku. Możesz użyć, tail -f
aby uniknąć tego problemu.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
W przypadku niektórych tail
implementacji możesz zostać ugryziony przez buforowanie: tail
proces zaczeka, aż zgromadzi wystarczającą ilość bajtów, aby wyemitować dane wyjściowe. Nie sądzę, że można to rozwiązać w przyborniku POSIX; jeśli to jest problem, użyj trywialnego programu C, Perl lub Python. O ile mogę powiedzieć, tail
z GNU coreutils (tak jak w Linuksie i gdzie indziej) jest bezpieczny pod tym względem.
Gdy zatrzymasz demona, echo >/var/run/daemon.fifo
zabije tail
proces.
Uruchomienie programu na ekranie
Zamiast wywoływać demona bezpośrednio z menedżera usług (czy naprawdę używasz tylko SysV init, czy czegoś dodatkowego, takiego jak skrypty opakowania lub Upstart?), Wywołaj
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Ponieważ demon nie będzie procesem potomnym menedżera usług, należy upewnić się, że wysłano sygnał do właściwego procesu. Jak to zrobić, zależy od tego, w jaki sposób demon jest uruchamiany i od czego.
Z technicznego punktu widzenia możliwe jest dołączenie działającego procesu do terminala, ale istnieje ryzyko awarii programu, więc zdecydowanie nie jest to system produkcyjny.
Ta -L
opcja powoduje, że screen zapisuje do pliku wszystko, co pojawia się w jego oknie. Nazwa pliku jest podana w daemon.screenrc
z logfile
dyrektywą.