Ich suche nach etwas, von dem ich vermute, dass es es nicht gibt: Eine nicht blockierende gepufferte Named Pipe (FIFO) zur Verwendung über die Befehlszeile. Gibt es so etwas?
Hier ist der Anwendungsfall: Angenommen, ich habe einen Prozess, der eine lange Zeit im Hintergrund abläuft und eine Menge Ausgabe anstößt stdout
. Ich kümmere mich nicht wirklich um die Ausgabe und möchte sie nicht speichern (vielleicht habe ich nicht genug Platz dafür), aber ich möchte in regelmäßigen Abständen "vorbeischauen" und verfolgen, was es tut, und dann wieder aussteigen und überlasse es seiner Arbeit. Daher möchte ich die Ausgabe auf diese theoretisch gepufferte, nicht blockierende Named Pipe umleiten und dann regelmäßig darauf zugreifen.
Im Grunde möchte ich so anfangen ( 10M
als Größe des Puffers):
mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
... und schauen Sie regelmäßig vorbei, um zu sehen, was los ist ...
tail -f magicfifo
... ohne die magicfifo
gesamte Ausgabe zu speichern (also keine normale Datei) und ohne den Ausspeisungsprozess zu blockieren, wenn sie voll ist und nicht abgegriffen wird (also keine ganz normale Named Pipe).
Ich denke nicht, dass Lösungen dies beinhalten tail
oder prune
tun werden (naja, ich kann mir eine Problemumgehung vorstellen, die dies beinhaltet tail
), da tail
ich trotzdem alle Daten irgendwo speichern müsste (wenn ich sie sehen und nicht mehr sehen möchte). und prune
muss die Datei neu schreiben, vermutlich (ich gebe zu, ich habe das nicht versucht / bewiesen), um die Umleitung des Prozesses zu unterbrechen, der die gesamte Ausgabe generiert.
Ich erwarte, ich könnte ein Hilfsprogramm schreiben, um dies zu tun, aber * nix hat so viele coole Aspekte von Dateien und Pipes und so, dass ich einfach nicht anders kann, als zu glauben, dass es das gibt, und ich weiß es einfach nicht.
Also: Gibt es so etwas und wenn ja, was ist es?
quelle
Antworten:
Ich denke, was Sie suchen, ist GNU
screen
. Es verwaltet einen Puffer, um den letzten Bildschirm oder zwei Ausgaben von einem oder mehreren Programmen zu speichern, und ermöglicht es Ihnen, die Verbindung zu trennen und später zurückzukehren.quelle
tmux
unddtach
- alles in der gleichen Klasse von Terminal-Multiplexer / Session-Manager-Anwendungen sollte in der Lage sein, dasselbe zu erreichen.Sie können verwenden
pv
, es bietet so viel Pufferung, wie Sie in einer Pipeline möchten. Du kannst es so benutzen:Das würde Ihnen bis zu 1 GB Pufferung zwischen
spewingprocess
und dem FIFO geben. Die meisten Linux-Distributionen bietenpv
ein Paket mit dem Namen, ob Sie es glauben oder nicht, anpv
.quelle
Ich hatte das gleiche problem Dies ist meine erste Lösung. Schreiben Sie zuerst die Ausgabe in eine Datei, die nach jeder Zeile abgeschnitten wird, damit sie nicht unendlich groß wird:
Lesen Sie dann mit tail aus der Datei (wobei
2> /dev/null
die Fehlermeldung "Datei abgeschnitten" beseitigt wird):Auf diese Weise wächst der Puffer nicht und wir können multiplexen, z. B. so viele Tails ausführen, wie wir möchten. Das Problem bei diesem Ansatz ist jedoch, dass wir Daten verlieren können, wenn wir schneller abschneiden, als der Schwanz lesen kann, wie dieser Test zeigt:
Nach einiger Zeit sind die erste und letzte Zeile:
Da die Datei jedoch weniger Zeilen enthält, gehen einige verloren:
Dies scheint dennoch eine gute Lösung zu sein, wenn Sie sich nicht so sehr für Datenverluste interessieren oder wenn Ihr Spewing-Prozess nicht schnell genug ist, um Datenverluste zu verursachen.
quelle