Ich führe derzeit ein Serverkonsolenprogramm auf einem Bildschirm aus, da ich es sowohl lesen als auch gelegentlich Befehle senden muss.
Ich möchte die App als Daemon im Hintergrund ausführen (mit init starten / stoppen).
Ich könnte tail -f
das Protokoll erstellen, aber dadurch kann ich keine Eingaben an den Prozess senden.
Gibt es eine Möglichkeit, dies so einzurichten, dass ich Eingaben lesen und senden kann, sie aber immer noch im Hintergrund laufen lassen?
Ich möchte auch in der Lage sein, Eingaben von verschiedenen Prozessen an den Dämon zu senden (ein Shell-Skript, das beispielsweise einen "Stop \ n" -Befehl senden könnte).
scripting
shell-script
tail
Bill K.
quelle
quelle
Antworten:
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).
Und schreiben Sie einfach Befehle in die Pipe:
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.Bei einigen
tail
Implementierungen kann es sein, dass Sie durch Pufferung gebissen werden: Dertail
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 dastail
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 dertail
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
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 wirddaemon.screenrc
mit derlogfile
Direktive angegeben.quelle
stuff
Befehl des Bildschirms ) auf das Terminal innerhalb des Bildschirms schreiben . Aber Sie brauchen hier nicht den Overhead (Verarbeitung, aber vor allem kognitiv) eines Terminals, eine Pipe ist fast genug (es reicht mit einem kleinen Relay-Prozess, bei dem das Ende der Datei ignoriert wird). Vielleicht möchten Sie ein wenig mit<fifo cat
oder<fifo tail -f | cat
in einem Terminal undecho >fifo; echo >fifo
in einem anderen Terminal experimentieren . Ich denke, es wird dir gut gehen.