Gibt es einen Unix-Befehl, um Änderungen an der Ausgabe eines anderen Befehls aufzuzeichnen?

327
Ilya Bobyr

Ich habe eine lange Operation, die sich auf einen Zustand auswirkt. Dieser Zustand wird angezeigt, indem beispielsweise ein bestimmter Befehl ausgeführt wird showst.

Ich möchte ein Protokoll aller möglichen Ausgaben showstsehen, die während dieses langen Betriebs angezeigt werden.

Für eine kurze Operation würde ich verwenden

watch -n0.1 showst 

Und würde nur auf das Terminal schauen und schauen, was los ist. Aber wenn die Operation eine Stunde dauert, ist das nicht sehr praktisch. Ich möchte ein Protokoll haben, das mir sagt, dass sich die showstAusgabe zu einem bestimmten Zeitpunkt geändert hat. Und dann hat sich das geändert.

Gibt es einen Befehl, der mir helfen kann?


Bearbeiten, um etwas Klarheit hinzuzufügen.

Hier ist ein konkretes Beispiel dafür, was ich gerne sehen würde. Nehmen wir an, die Operation dauert eine Stunde. showstAusgänge Afür die erste halbe Stunde, dann Bfür 10 Minuten und wechseln dann Awieder zu.

Ich möchte ein ähnliches Protokoll anzeigen:

2016-08-19 12:00: A 2016-08-19 12:30: B 2016-08-19 12:40: A 

Es wäre toll, wenn Aund Bkönnte auch mehrzeilige sein.

Es ist ein bisschen wie watch --differencesmit einem Terminal, wenn man sitzt und zuschaut, aber ich möchte das in einem Protokoll.

1
wird es an STDOUT ausgegeben? Sie könnten showst> log.txt versuchen. In der nächsten Zeile können Sie -f log.txt oder die Datei oder etwas anderes grep. cybernard vor 7 Jahren 0
Die Ausgabe erfolgt in stdout, aber der Befehl gibt den aktuellen Status und die Exits aus. Wenn ich 'showst> log.txt' starte, würde ich nur den aktuellen Status erhalten. Ich möchte alle möglichen Zustände über einen bestimmten Zeitraum sehen. Ich möchte identische Ausgaben "gefaltet" und nur wenn sich etwas in der Ausgabe ändert, möchte ich einen neuen Eintrag im Protokoll sehen. Ilya Bobyr vor 7 Jahren 0
showst >> log.txt wird angefügt. cat log.txt | sort --unique versteckt und sortiert. cybernard vor 7 Jahren 0
Das Anhängen ist an sich nicht hilfreich, wenn nach der Ausgabe des aktuellen Status 'showst' vorhanden ist. Und wenn ich es in einer Schleife ablaufe, hätte ich über einen Log-Zeitraum mehrere identische Einträge. Das würde ich nicht wollen. Ich möchte sehen, wann sich die Ausgabe geändert hat. Ähnlich wie 'watch --differences', aber in einem Protokoll, anstatt auf dem Terminal. Ilya Bobyr vor 7 Jahren 0

1 Antwort auf die Frage

1
A. Loiseau

Ich weiß nichts von einem dedizierten Befehl, aber ich hätte so etwas geschrieben:

(while true; do sleep 0.1; showst; done) | uniq 

Hinweis: Schlafimplementierungen unter Linux unterstützen normalerweise solche Floating-Argumente. Wenn Sie jedoch eine tragbare Lösung benötigen, sollten Sie dort ein Integer-Argument verwenden, das das Pooling auf einen Sekunden-Tick begrenzt oder gar keinen Ruhezustand, was Ihre CPU stark beansprucht.

Siehe auch Manpages zu sleep und uniq .

Dies funktioniert nur, wenn die Ausgabe 'showst' eine Zeile ist. Und es sagt mir nicht, wann die Änderung stattgefunden hat. Ich würde die Reihenfolge der Änderungen nicht sehen. Wenn sich der Zustand von A nach B und dann wieder nach A ändert, hätte ich nur 'A' und 'B' in der Ausgabe. Ilya Bobyr vor 7 Jahren 0
@IlyaBobyr für Ihren letzten Satz: A-> B-> A würde Ihnen alle 3 anzeigen, da "uniq" davon ausgeht, dass es eine sortierte Liste gibt: Es entfernt nur aufeinanderfolgende Duplikate. drewbenn vor 7 Jahren 0
Wie von @drewbenn und von der Manpage gesagt, druckt "uniq" das erste Vorkommen einer neuen Serie, sobald sie kommt, und ignoriert aufeinanderfolgende Duplikate. Sie können den showst-Aufruf "| grep" aufrufen, um die gewünschte Zeile oder Wörter zu extrahieren, und Sie können `| beim Lesen von NEW_STATE anhängen. echo "$ (date) - $ "; done`, um Datumsänderungen der ermittelten Änderungen an das Ergebnis anzuhängen. A. Loiseau vor 7 Jahren 1