Mam długo działający proces wsadowy, który wyprowadza niektóre informacje debugowania i procesu na standardowe wyjście. Jeśli po prostu uruchomię z terminala, mogę śledzić „gdzie to jest”, ale wtedy dane stają się zbyt duże i przewijają się poza ekran.
Jeśli przekieruję na wyjście do pliku „> out.txt”, w końcu otrzymam całe wyjście, ale jest ono buforowane, więc nie mogę już zobaczyć, co robi teraz.
Czy istnieje sposób na przekierowanie wyjścia, ale nie buforowanie zapisów?
Odpowiedzi:
Możesz jawnie ustawić opcje buforowania standardowych strumieni za pomocą
setvbuf
wywołania w C (patrz ten link ), ale jeśli próbujesz zmodyfikować zachowanie istniejącego programu, spróbujstdbuf
(częśćcoreutils
zaczynająca się od wersji 7.5 najwyraźniej).Buforuje
stdout
do linii:To
stdout
całkowicie wyłącza buforowanie:źródło
./configure && make
opłata. Nie musisz nawet go później instalować, możesz po prostu użyćstdbuf
pliku binarnegosrc/
.Możesz uzyskać wyjście buforowane wierszem do pliku, używając
script
polecenia w następujący sposób:źródło
batch_process
jeśli dołączysz&
do powyższego polecenia, przynajmniej na moim Linux-ie), co wydaje się jak niezwykle powszechny przypadek użycia, i b) nie ma tutaj wyjaśnienia, jak działa ta inkantacja.Na Ubuntu, pakiet
unbuffer
programu (zexpect-dev
) wykonał dla mnie lewę. Po prostu biegnij:unbuffer your_command
i to go nie buforuje.
źródło
Najłatwiejsze rozwiązanie, które znalazłem (nie wymagało instalowania żadnych pakietów stron trzecich) zostało wspomniane w podobnym wątku na stronie Unix i Linux : użyj
script
polecenia. Jest stary i prawdopodobnie już zainstalowany.Zauważ, że pierwszym parametrem nazwy pliku dla
script
polecenia jest plik dziennika, który ma zostać zapisany . Jeśli po prostu uruchomiszscript -q your_command
, zastąpisz polecenie, które chcesz uruchomić, z plikiem dziennika. Sprawdźman script
, aby być bezpiecznym, zanim spróbujesz.źródło
wypróbuj
script
polecenie; jeśli twój system go ma, przyjmuje nazwę pliku jako argument, cały tekst zrzucony na standardowe wyjście zostaje skopiowany do pliku. Jest to bardzo przydatne, gdy program instalacyjny wymaga interakcji.źródło
Osobiście wolę przesyłanie danych wyjściowych polecenia, które chcę sprawdzić
tee
.script
zapisuje zbyt wiele informacji, w tym czas naciśnięć klawiszy i wiele znaków, które nie mogą zostać wydrukowane. To, cotee
oszczędza, jest dla mnie o wiele bardziej czytelne dla człowieka.źródło
tee
wpływa na to również buforowanie. Często nadal wyświetlam częściowe linie wyświetlane przez tee podczas dzielenia wyjścia zfind
poleceń.Przekieruj dane wyjściowe do pliku i postępuj zgodnie z
tail -f
poleceniem.Edytować
Jeśli nadal występuje problem z buforowaniem, skorzystaj z narzędzia syslog (które zasadniczo nie jest buforowane). Jeśli proces wsadowy działa jako skrypt powłoki, można to zrobić za pomocą polecenia logger. Jeśli zadanie wsadowe działa w języku skryptowym, i tak powinna istnieć możliwość logowania.
źródło
This answer is useful
odpowiedzi, które nie działają i nie mogą działać?Możesz użyć
tee
polecenia, po prostu magia!someCommand | tee logFile.log
będzie zarówno wyświetlacz w konsoli i zapisywać do pliku dziennika.źródło
tee
nie zatrzyma buforowania.tee
nie uniknie buforowania, ale pozwoli ci tylko spojrzeć na wynik. Tego właśnie chciał @JamesDean (jak nie rozumiem jego pytania), ale myślę, że buforowanie nie jest tutaj tak naprawdę problemem. Jeśli masz więcej szczegółów, daj mi znać.tee
aby uzyskać lepszy widok danych wyjściowych, których nie otrzymujesz?>
nic nie widać na konsoli. Wydaje mi się, że @JamesDean używa słowa „buforowanie”, aby to opisać. Zamieszczę komentarz na jego pytanie, aby mógł powiedzieć więcej o tym, czego chce.