Ist es möglich, einen benutzerdefinierten Stream zu erstellen?

Ist es möglich, einen benutzerdefinierten Stream zu erstellen?

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 foound anderen Prozessen das Lesen daraus erlauben würde, fooals 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 -fist für „follow“ und inwenigerSie können den gleichen Effekt mit Ffor ”follow“ erzielen; in anderen Programmen wird dies möglicherweise als „Tailing“ einer Datei bezeichnet, da taildies das klassische Dienstprogramm ist, das dies tut. Siehedas tailTag 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-optionim 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 -rdass 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.

verwandte Informationen