2013-08-30 8 views
12

Ich habe den folgenden Befehl getestet, aber es funktioniert nicht.Warum ist 'top | grep> Datei 'funktioniert nicht?

$> top -b -d 1 | grep java > top.log 

Es wird kein Standardfehler verwendet. Ich habe überprüft, dass es Standardausgabe verwendet, aber top.log ist immer leer. Warum ist das?

+0

Ich bin mir nicht ganz sicher, aber ich denke Top ist "interaktiv" und hat keinen typischen Standard-Output-Stream. Grep erhält also vielleicht nicht den Input. – squiguy

+0

Wird Java tatsächlich ausgeführt und benötigt genügend Ressourcen, um angezeigt zu werden? – user2357112

+0

Gemessen an der [man page] (http://www.unixtop.org/man.shtml) erscheinen die Optionen, die Sie an "top" übergeben, überflüssig. – user2357112

Antwort

23

Standardmäßig puffert der Ausgang grep, was bedeutet, dass nichts in top.log geschrieben wird, bis der Ausgang grep die Größe des Puffers überschreitet (was von System zu System variieren kann).

Tell grep Tell Zeilenpufferung am Ausgang verwenden. Versuchen Sie:

+0

Großartig! Es läuft gut. Vielen Dank. – JaycePark

+0

Sollte 'grep' seinen Ausgang nicht spülen, wenn' top' beendet wird? Mit "-d 1" sieht es so aus, als müsste das sofort passieren. – user2357112

+0

@ user2357112 Nur wenn es verlassen würde! – devnull

2

In meinem eingebetteten Computer hatte Grep nicht die Option --line-buffered. So habe ich diese Abhilfe für meine ich:

while :;do top -b -n 1 | grep java >> top.log;done & 

Auf diese Weise ich einen laufenden Monitor im Hintergrund für ein Programm wie „Java“ haben könnte und alle Ergebnisse halten in der Datei top.log.

Verwandte Themen