Aus einer Pipe lesen, in eine Datei schreiben
Wenn der Dämon Eingaben lesen soll, die von einem beliebigen Prozess erzeugt wurden, müssen Sie diesen Prozess mit einer Pipe verbinden. Hier gibt der beliebige Prozess das Echo von Befehlen wieder und wird in einem anderen Kontext ausgeführt. Erstellen Sie also eine Named Pipe (in Unix-Kontexten oft als Fifo bezeichnet).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
Und schreiben Sie einfach Befehle in die Pipe:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Es ist jedoch unwahrscheinlich, dass dies so funktioniert: Es besteht eine gute Chance, dass der Dämon beendet wird, wenn er ein Dateiende an seiner Standardeingabe sieht. Dies geschieht, sobald der erste Prozess, der in die Pipe schreibt, beendet wird. Sie können tail -f
dieses Problem vermeiden.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
Bei einigen tail
Implementierungen kann es sein, dass Sie durch Pufferung gebissen werden: Der tail
Prozess wartet, bis er genügend Bytes angehäuft hat, um eine Ausgabe auszugeben. Ich denke nicht, dass dies in der POSIX-Toolbox lösbar ist. Wenn dies ein Problem ist, verwenden Sie ein einfaches C-, Perl- oder Python-Programm. Soweit ich das tail
beurteilen kann, sind die von GNU Coreutils (wie sie unter Linux und anderswo zu finden sind) in dieser Hinsicht sicher.
Wenn Sie den Dämon stoppen, echo >/var/run/daemon.fifo
wird der tail
Prozess abgebrochen.
Programm im Bildschirm starten
Anstatt den Daemon direkt von Ihrem Service Manager aus aufzurufen (verwenden Sie wirklich nur SysV init oder etwas Zusätzliches wie Wrapper-Skripte oder Upstart?), Rufen Sie auf
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Da der Daemon kein untergeordneter Prozess des Service Managers ist, müssen Sie sicherstellen, dass ein Signal an den richtigen Prozess gesendet wird. Wie das geht, hängt davon ab, wie und von was der Daemon gestartet wird.
Es ist technisch möglich , einen laufenden Prozess an ein Terminal anzuschließen, aber es besteht die Gefahr, dass Sie das Programm zum Absturz bringen. Dies ist also definitiv für ein Produktionssystem nicht der Fall.
Mit dieser -L
Option schreibt der Bildschirm alles, was in seinem Fenster angezeigt wird, in eine Datei. Der Dateiname wird daemon.screenrc
mit der logfile
Direktive angegeben.