Ich versuche, tail
eine Protokolldatei auf mehreren Remotecomputern zu erstellen und die Ausgabe an meine lokale Arbeitsstation weiterzuleiten. Ich möchte, dass die Verbindungen geschlossen werden, wenn ich Ctrl- drücke C.
Im Moment habe ich folgende Funktion, die fast wie vorgesehen funktioniert .
function dogfight_tail() {
logfile=/var/log/server.log
pids=""
for box in 02 03; do
ssh server-$box tail -f $logfile | grep $1 &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
trap wait
}
Die Verbindungen werden geschlossen und ich erhalte die Ausgabe von tail
. ABER es gibt eine Art Pufferung, da die Ausgabe stapelweise erfolgt.
Und hier ist der lustige Teil ...
Ich kann das gleiche Pufferverhalten feststellen, wenn ich Folgendes ausführe und "test" /var/log/server.log
4-5 Mal an die Datei auf den Remotecomputern anhänge ...
ssh server-01 "tail -f /var/log/server.log | grep test"
… Und zwei Möglichkeiten gefunden, es zu deaktivieren…
Füge -t Flag zu ssh hinzu.
ssh -t server-01 "tail -f /var/log/server.log | grep test"
Entfernen Sie das Zitat aus dem Remote-Befehl.
ssh server-01 tail -f /var/log/server.log | grep test
Keiner dieser Ansätze funktioniert jedoch für die Funktion, die auf mehreren oben genannten Maschinen ausgeführt wird.
Ich habe versucht, dsh, die das gleiche Pufferverhalten beim Ausführen haben.
dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"
Gleiches gilt, wenn ich das Zitat entferne, verschwindet die Pufferung und alles funktioniert einwandfrei.
dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test
Auch ausprobiert parallel-ssh
was genauso funktioniert wie dsh
. Kann jemand erklären, was hier los ist?
Wie behebe ich dieses Problem? Wäre ideal, ssh
wenn möglich mit Straight zu gehen .
PS Ich möchte keine multitail
oder ähnliche Befehle verwenden, da ich willkürliche Befehle ausführen können.
dbitail
es hier auschecken und herunterladen .Antworten:
Was Sie sehen, ist die Wirkung eines
grep
von Glibc bereitgestellten Standard-Standardausgabepuffers . Die beste Lösung ist, es zu deaktivieren--line-buffered
(GNU grep, ich bin mir nicht sicher, welche anderen Implementierungen es unterstützen könnten oder ähnliches).Was , warum dies geschieht nur in einigen Fällen:
Führt den gesamten Befehl in Anführungszeichen auf dem Server aus und
grep
wartet, bis der Puffer gefüllt ist.Läuft
grep
auf Ihrem lokalen Rechner auf dem Ausgangtail
, der über den SSH-Kanal gesendet wird.Der entscheidende Teil hier ist, dass
grep
das Verhalten angepasst wird, je nachdem, obstdin
es sich um ein Terminal handelt oder nicht. Wenn Sie ausführenssh -t
, wird der Remote-Befehl mit einem steuernden Terminal ausgeführt, und dahergrep
verhält sich der Remote-Befehl wie Ihr lokaler.quelle
ssh tail | grep
Ausgänge zum lokalen Terminal, ungepuffert.ssh -t "tail|grep"
Ausgänge zu einer Pty, ungepuffert.ssh "tail|grep"
Ausgaben an eine Pipe (tosshd
), gepuffert (es sei denn--line-buffered
).schau dir das an:
multitail
Mit MultiTail können Sie Protokolldateien und Befehlsausgaben in mehreren Fenstern eines Terminals überwachen, einfärben, filtern und zusammenführen.
Um die Protokolle auf mehreren Servern zu erweitern, verwenden Sie:
quelle
multitail <(ssh …) <(ssh …)
- und ermöglichen das gewünschte Ergebnis, auch wenn sie ursprünglich nicht der Meinung waren, dass die Frage beantwortet werden könnte.Sie können in'side log auschecken.
Ein von mir erstelltes Java-Tool, das lokale und entfernte Protokolldateien mit SSH lesen kann. Es ist ziemlich einfach zu bedienen.
Weitere Erklärungen: https://github.com/pschweitz/insidelog/wiki
Laden Sie einfach die Ihrem Betriebssystem entsprechende Version der in Ihrer Java Runtime ausführbaren JAR-Version herunter (erfordert Java 8_40 oder höher):
https://github.com/pschweitz/insidelog/releases
Sie finden eine vollständige Dokumentation (eingebettet in und auf Githubs Seite).
quelle