Użycie top
polecenia z przekierowaniem działa dobrze:
top > top.log
Teraz chcę użyć grep do filtrowania określonej linii:
top | grep "my_program" > top.log
Ale plik dziennika pozostanie pusty. Ale grep dostarcza dane wyjściowe podczas używania
top | grep "my_program"
Gdzie my_program
musi zostać zastąpiony działającym programem, aby zobaczyć dane wyjściowe.
Dlaczego moje podejście nie działa? Jak mogę to naprawić?
-b
opcjętop
lubps
zamiast tego.-b
nie rozwiązał mojego problemu, ale rozwiązał niektóre problemy z kodowaniem. Dziękuję Ci.Odpowiedzi:
Mam takie samo zachowanie, jakie opisujesz. W systemie Ubuntu 11.10
nie wytwarza żadnych wyników.
Uważam, że powodem tego jest to, że grep buforuje swoje dane wyjściowe. Aby powiedzieć GNU grep, aby wyrzucał dane wyjściowe linia po linii, użyj
--line-buffered
opcji:Zobacz także to pytanie SO, aby znaleźć inne potencjalne rozwiązania.
źródło
--line-buffered
rozwiązuje problem.-b
opcja jest nadal dobrą radą Lwa Lewitskiego. To rozwiązało niektóre problemy z kodowaniem pliku dziennika.powinieneś użyć:
„-n 1” uruchamia się na szczycie dla jednej iteracji, a następnie kończy działanie zamiast ciągle aktualizować co kilka sekund
ponieważ szukasz tylko jednej linii, chociaż ps byłoby lepszym narzędziem do użycia.
źródło
Moje obejście tego problemu:
W ten sposób mogłem mieć uruchomiony monitor w tle dla mojego_programu i zachować wszystkie wyniki w pliku top.log.
źródło
Spróbuj tego:
Co oznacza
2>&1
?źródło
Chociaż oba działają dla mnie, myślę, że rada Lwa Lewitskiego jest słuszna. Użyj
-b
argumentu.Istnieje duża szansa, że problemem jest przekierowanie danych wyjściowych i że nic nie osiąga się przez standardowe wyjście, więc spróbuj tego:
Pamiętaj, że możesz mieć również problemy z buforowaniem danych wyjściowych. Twoja powłoka nie będzie ciągle zapisywać do pliku, więc
top.log
wypełnienie może trochę potrwać .źródło