Das Verwenden des top
Befehls mit Umleitung funktioniert einwandfrei:
top > top.log
Jetzt möchte ich grep verwenden, um eine bestimmte Zeile zu filtern:
top | grep "my_program" > top.log
Die Protokolldatei bleibt jedoch leer. Aber grep liefert bei Verwendung eine Ausgabe
top | grep "my_program"
Wo my_program
muss durch ein laufendes Programm ersetzt werden, um eine Ausgabe zu sehen.
Warum funktioniert mein Ansatz nicht? Und wie kann ich das beheben?
-b
Option ansehentop
oderps
stattdessen verwenden.-b
löste nicht mein Problem, löste aber einige Kodierungsprobleme. Vielen Dank.Antworten:
Ich habe das gleiche Verhalten, das Sie beschreiben. Unter Ubuntu 11.10
erzeugt keine Ausgabe.
Ich glaube, der Grund dafür ist, dass grep seine Ausgabe puffert. Verwenden Sie die folgende
--line-buffered
Option, um GNU grep anzuweisen, die Ausgabe zeilenweise auszuspucken :Siehe auch diese SO-Frage für andere mögliche Lösungen.
quelle
--line-buffered
löst das Problem.-b
Option ist auch nach wie vor ein guter Rat von Lev Levitsky. Dadurch wurden einige Codierungsprobleme mit der Protokolldatei behoben.du solltest benutzen:
Das "-n 1" wird für eine Iteration oben ausgeführt und dann beendet, anstatt alle paar Sekunden fortlaufend zu aktualisieren
da du nur nach einer Zeile suchst, wäre ps ein besseres Werkzeug.
quelle
Mein Workaround für dieses Problem war:
Auf diese Weise könnte ich einen laufenden Monitor für my_program im Hintergrund haben und alle Ergebnisse in der Datei top.log speichern.
quelle
Versuche dies:
Was bedeutet
2>&1
?quelle
Obwohl beide für mich arbeiten, denke ich, dass Lev Levitskys Rat der richtige ist. Verwenden Sie das
-b
Argument.Es besteht eine gute Chance, dass die Ausgabeumleitung das Problem ist und dass Sie nichts über stdout erhalten. Versuchen Sie stattdessen Folgendes:
Beachten Sie, dass Sie möglicherweise auch Probleme mit der Ausgabepufferung haben. Ihre Shell schreibt nicht ständig in die Datei, daher kann es eine Weile dauern, bis die Datei
top.log
gefüllt ist.quelle