Wie kann man mehrere Pipe-Dateien oder Streams "anhängen"?

722
Andrey Utkin

Ich muss viele Webserver auf Laufzeitfehler überwachen und habe die Idee, ein Skript wie dieses auszuführen

#! / bin / bash -e  # Beispielsatz von Hosts HOSTS = ( host1 host2 )  für den Gastgeber in $  tun [[! -e $ .pipe]] && mkfifo $ .pipe (ssh -n $ host "Schwanz -n0 -F / tmp / test" >> $ .pipe) & erledigt  Schwanz -F -c +0 * .pipe 

und es würde mir angeblich eine solche Ausgabe geben:

==> host1.pipe <== event 1 event 2  ==> host2.pipe <== event 3 event 4  ==> host1.pipe <== event 5 

Sie bekommen den Punkt. Ich sehe Protokollzeilen, wenn sie angezeigt werden, wobei der Ursprung offensichtlich ist, wie tail -Fes normalerweise angezeigt wird, wenn Sie mehrere Dateien ausführen.

Tail-Optionen lassen -c +0angeblich Stream-Inhalte ab dem 0. Byte drucken.

Das geht aber nicht! Was ich sehe, ist wie

==> host1.pipe <== event 1 event 2 event 5 

Das heißt, es wird kein Strom außer dem ersten angezeigt.

Hier ist eine einfachere Variante des obigen Skripts, die immer noch das Problem reproduziert:

tail -F -c +0 \ <(ssh host1 "tail -n1 -F /tmp/test") \ <(ssh host2 "tail -n1 -F /tmp/test") \ ; 

Noch einfacher, immer noch das Problem reproduzierend:

tail -F -c +0 \ <(while true; do date; sleep 1; done) \ <(while true; do date +%s; sleep 1; done) 

Ich verwende tail aus coreutils 8.27 und den Linux-Kernel 4.9.14.

Vielen Dank im Voraus für jeden Hinweis!

Beachten Sie, dass ich nicht gerne "Multitail" verwenden möchte. Ich habe es ausprobiert. Das Aufteilen des Bildschirms in Teilfenster lässt sich nicht auf Dutzende von Servern skalieren, die wir jetzt haben.

0
Ein Mann von coreutils maillist hat das Problem bestätigt und denkt an einen Patch, der meine Verwendung zulässt: http://lists.gnu.org/archive/html/coreutils/2017-09/msg00021.html Andrey Utkin vor 7 Jahren 0

1 Antwort auf die Frage

0
Kamil Maciorowski

Beachten Sie, dass ich nicht gerne zur Verwendung vorgeschlagen werde multitail. Ich habe es ausprobiert. Das Aufteilen des Bildschirms in Teilfenster lässt sich nicht auf Dutzende von Servern skalieren, die wir jetzt haben.

Wie wäre es mit der -LOption? Der Bildschirm wird nicht geteilt.

multitail \ --mark-change \ -L "while sleep 1; do date; done" \ -L "while sleep 5; do date +%s; done" \ -L "while sleep 7; do date +%Y; done" 

Wenn Sie Named Pipes verwenden möchten, sollten Sie -Istatt -L. Leider multitailerfordert es -Ifür jede Datei einen separaten Eintrag. Dies erschwert den *Ansatz der Wildcard ( ). Pech, seine -IwOption scheint nicht bei Named Pipes zu funktionieren. und ich konnte das Tool nicht zusammenarbeiten lassen xargs(zumindest bei meinem Debian).

Es gibt noch einen Weg:

multitail --mark-change --mergeall *.pipe 

Die Ausgabe wird sehr ähnlich sein, was Sie erwartet haben tail.

Danke, die von Ihnen vorgeschlagenen Modi liefern tatsächlich das, was ich will (im Moment nur der erste Modus getestet). Ncurses interface finde ich jedoch ein wenig einschränkend. Es verfügt über einen eigenen Scrollback-Puffer, während ich möchte, dass mein Terminal sich darum kümmert. hat einen etwas seltsamen Scrollback-Zugriff. Wenn ich keine Antwort auf den ursprünglichen "Schwanz" bekomme (der einen Fehler hat, wie ich vermute), werde ich Ihre Antwort als ausgewählt markieren. Vielen Dank trotzdem, Ihre Hilfe wird sehr geschätzt. Andrey Utkin vor 7 Jahren 0