Ich bin nicht sicher, welche Terminologie ich hier verwenden soll, also haben Sie Geduld mit mir.
Ich schreibe eine Anwendung, dieeine Mengevon Protokollen. Ich dachte, es wäre cool, wenn meine Anwendung die Protokolle an streamen könnte foo
und anderen Prozessen das Lesen daraus erlauben würde, foo
als wäre es ein Stream (wie /dev/random
).
Das heißt, ich möchte einfach kontinuierlich Protokolle irgendwohin streamen (ohne mich um Dateisystemkram wie Archivieren, Löschen usw. kümmern zu müssen) und anderen Prozessen die Möglichkeit geben, auf diesen Stream „zugewiesen“, als wäre er eine endlose Datei.
Wie gehe ich dabei vor? Was ist foo
?
Im Idealfall:
terminal 1
> mkthing foo
> while :; do echo 'abcdefg' >> foo; sleep 1; done
terminal 2
> echo foo
(outputs "abcdefg" every second)
Antwort1
Die ganz normale Art, sich die Protokolle anzusehen, istschreibe sie in eine Datei. Wenn Sie die Protokolle sehen möchten, lesen Sie die Datei. Um zu beobachten, wie Zeilen an die Datei angehängt werden, verwenden Sie einen Befehl wietail -f
, das die Datei nach Erreichen des Dateiendes offen hält und auf zusätzliche Zeilen achtet, die angehängt werden. Die Option -f
ist für „follow“ und inwenigerSie können den gleichen Effekt mit F
for ”follow“ erzielen; in anderen Programmen wird dies möglicherweise als „Tailing“ einer Datei bezeichnet, da tail
dies das klassische Dienstprogramm ist, das dies tut. Siehedas tail
Tag auf dieser SiteWeitere Informationen zu Tailing-Dienstprogrammen finden Sie hier.
Wenn Sie die Protokolle absolut nicht in eine Datei schreiben möchten, können Sie die Anwendung inBildschirmodertmux. So führen Sie es /usr/bin/my_application --some-option
im Hintergrund aus, mit Bildschirm:
screen -S myapp -d -m /usr/bin/my_application --some-option
So überwachen Sie die Protokolle:
screen -S myapp -d -r
Drücken Sie Ctrl+ A d, um die Verbindung zu trennen, d. h., um die Überwachung der Protokolle zu beenden. Während Sie die Protokolle überwachen, können Sie auch Eingaben an die Anwendung senden, was erwünscht sein kann oder nicht. Um nur Lesezugriff zu gewähren, sieheGibt es eine Möglichkeit, „Screen“ im schreibgeschützten Modus auszuführen?
So starten Sie die Anwendung mit tmux:
tmux new-session -s myapp -d /usr/bin/my_application --some-option
So zeigen Sie die neuesten Protokolle an:
tmux attach -r -t myapp
Drücken Sie Ctrl+ A dzum Trennen. Führen Sie es aus tmux attach
, ohne -r
dass Sie mit der Anwendung interagieren können.
ABenannte Pipeist nicht das, was Sie wollen. Ich erwähne es nur, weil es oberflächlich betrachtet angemessen aussieht (und während ich schreibe, taucht es in Kommentaren auf). Es wird das tun, was Sie beschreiben:
mkfifo foo
while :; do echo 'abcdefg' >> foo; sleep 1; done
parallel zu
cat foo
Das ist nicht das, was Sie wollen, weil es genau einen Leser geben muss. Wenn es keinen Leser gibt, wird die Schreibseite blockiert. Wenn es mehrere Leser gibt, wird jede Zeile (oder jeder Block, je nachdem, wie das Programm die Ausgabe erzeugt) von genau einem Leser gesehen, der mehr oder weniger zufällig ausgewählt wird. Wenn es einen Leser gibt und dieser verschwindet, kann die Schreibseite nicht schreiben und erhält ein SIGPIPE, wenn sie diese nicht deaktiviert hat.