Jak mogę przestać śledzić dane wyjściowe w mniejszym stopniu, bez wpływu na polecenie generujące dane wyjściowe?

12

Korzystam z serwera, a dziennik tego serwera jest logowany w terminalu, a nie w żadnym pliku. Chciałbym użyć mniej, aby wyświetlić ten dziennik.

node server.js | less

Gdy chcę tylko zobaczyć dziennik, naciskam Shift+, Faby przejść do końca pliku i oglądać dzienniki. Kiedy chcę to zatrzymać, używam CTRL+ C.

Niestety to także zatrzymuje serwer. Chcę po prostu przestać oglądać koniec dziennika bez zatrzymywania serwera.

Jak to zrobić?

Ajay Kumar
źródło
1
Czy chcesz wyjść lessi powrócić do monitu powłoki z nodeserwerem działającym w tle, czy po prostu chcesz lesswrócić do normalnego trybu braku śledzenia, w którym możesz przewijać dziennik zamiast oglądać najnowsze wiersze?
Bajt Dowódca
@ByteCommander po naciśnięciu CTRL + C. Chcę, aby mój serwer nadal działał i chcę wrócić do mniej normalnego trybu nie śledzenia, w którym mogę przewijać.
Ajay Kumar

Odpowiedzi:

17

Nie mogę znaleźć żadnego sposobu wyjścia z Ftrybu less, więc będziesz musiał skorzystać z obejścia. Na przykład zapisz wynik w pliku tmp, a następnie obejrzyj ten plik tmp:

node server.js > tmpfile & less tmpfile

&Sprawia, że node.jspolecenie Uruchom w tle. Oznacza to, że less tmpfilerozpocznie się natychmiast i będzie śledził plik tmp.

Po wejściu lessmożesz nacisnąć, Faby przejść do trybu śledzenia, ale teraz Ctrl+ Cnie zabije serwera, tylko zatrzyma śledzenie. Możesz teraz przewijać, jak chcesz i możesz nacisnąć, Faby wznowić śledzenie.

terdon
źródło
13

Wygląda na to, że zwykle nie powinieneś wychodzić z trybu „Forward forever”, czyli tak man lessnazywa się tryb wprowadzany po naciśnięciu Shift+ F.

Znalazłem jednak trochę brudną sztuczkę, jak możesz wrócić do normalności. Na chwilę jednak zawiesi polecenie, więc nie jestem pewien, czy będzie on odpowiedni dla twojego serwera, który prawdopodobnie powinien działać nieprzerwanie.


W każdym razie oto sztuczka:

Zakładam, że zacząłeś już node server.js | lessalredy i nacisnąłeś Shift+, Faby przejść do trybu „Forward forever”. Teraz lessnie reaguje już na żadne naciśnięcia klawiszy.

W tym stanie możesz nacisnąć Ctrl+, Caby zabić proces serwera, a lessnastępnie możesz wyjść , naciskając Q(co jednak z jakiegoś powodu pozostawi polecenie jako zatrzymany proces na liście zadań - musisz uruchomić, fgaby kontynuować i pozwolić mu całkowicie zakończyć później), ale nie tego chcemy.

Zamiast tego możesz także nacisnąć Ctrl+, Zaby zatrzymać („zamrozić”) polecenie i powrócić do monitu powłoki. Teraz szybko wpisać polecenie powłoki fg( „ f ore g round”), aby pozwolić polecenie nadal działa w planie. Pamiętaj, że nodeproces serwera jest również wstrzymany w tym krótkim czasie, musisz rozważyć, czy jest to dopuszczalne, czy nie.

Więc teraz lessznów działa na pierwszym planie, tak? Tak, ale magicznie nie jest już w trybie „Forward forever”. Możesz np. Ponownie użyć klawiszy strzałek, aby przewijać w górę i w dół.

Niestety lesswydaje się, że całkowicie przestał aktualizować swój bufor, możesz tylko przewinąć w dół do linii, w której wcześniej zamroziłeś polecenie, a nie dalej. nodeSerwer wciąż działa i wytwarza kopie choć, po prostu dostać lesssię ponownie odświeżyć.

Najłatwiejszy sposób to po prostu otworzyć lessekran pomocy i zamknąć go, naciskając kolejno klawisze Hi Qkolejno. Teraz wszystko znów działa dobrze.


Najczystszym rozwiązaniem jest jednak prawdopodobnie podążanie za odpowiedzią Terdona i przekierowanie danych wyjściowych do pliku tymczasowego za pomocą pliku lessdo monitorowania.

Bajt Dowódca
źródło
Raczej genialny brudny hack.
TRiG
Myślę, że wolę tę odpowiedź od zaakceptowanej. Zauważ, że możesz uruchomić %zamiast fg; Uważam, że łatwiej / szybciej pisać. Wydaje się również, że F(shift-f) nadal działa, nawet bez robienia tego hq. Miły! Teraz, gdy śledzę dzienniki, mogę ctrl-z % Enterzrobić mniej, a potem wrócić do śledzenia, naciskając F!
JoL
BTW, nie powinieneś nazywać tego brudnym. Osobiście wydaje się to czystsze niż inne rozwiązania, ponieważ tutaj nie musisz zaśmiecać swojego systemu plików plikami tymczasowymi (dla których musisz wymyślić nazwę, a następnie usunąć), szczególnie gdy możesz skorzystać lessz poniższych działają w wielu terminalach jednocześnie.
JoL
2
Nie szukałem źródła, ale to prawdopodobnie działa, ponieważ TSTPsygnał przerywa odczytane wywołanie systemowe, które czekało na nadejście nowych danych; lessotrzymuje 0 bajtów i stwierdza, że ​​wyjście zostało zakończone. Aby uniknąć wstrzymywania serwera, otwórz nowe okno terminala; wykonać psi zidentyfikować identyfikator lessprocesu; następnie wpisz kill -TSTP <PID>; kill -CONT <PID>. W ten sposób sygnały powinny być dostarczane z powrotem do tyłu, bez opóźnienia podczas pisania.
Alexis
@alexis, jeśli zamierzasz użyć kill, możesz po prostu wysłać SIGINT. Wtedy nie będziesz musiał wysyłać CONT, a lesstylko czeka na ciebie.
mur
3

Jak mówi twoje pytanie:

Ten serwer jest zalogowany w terminalu, a nie w żadnym pliku.

Zakładam, że nie chcesz używać pliku dziennika (temp), być może twój dziennik jest ogromny lub z dowolnego powodu.


Nazwany potok, fifoplik.

To, co wymyśliłem, to użycie named pipe fileznanego również jako fifoplik, ten plik będzie służył tylko do przekierowywania dzienników do mniejszej ilości i nic na nim nie zostanie zapisane.

Najpierw utwórz fifo file:

mkfifo mylog

Uruchom serwer i przekieruj dzienniki do tego pliku:

node server.js > mylog &

Używaj mniej, aby czytać logi (-f zmusza mniej do czytania tego specjalnego pliku):

less -f mylog

Teraz możesz użyć shift+, Faby śledzić i CTRL+, Caby zatrzymać śledzenie, ale serwer nadal działa, możesz ponownie śledzić dane wyjściowe za pomocą shift+ F.


Plan tworzenia kopii zapasowych : Jeśli zatrzymałeś serwer, po prostu umieść polecenie ( node server.js > mylog &) w pliku np .:: server.sh, a następnie zamiast node server.js > mylog &uruchom uruchom: bash server.sh > mylog &i uruchom less -f mylog.

Ravexina
źródło
Po co używać tutaj pliku fifo zamiast zwykłego pliku? Jedyną korzyścią, jaką widzę, jest oszczędność miejsca na dysku, ale wątpię, czy będzie to odpowiednie dla czegoś takiego. Po zakończeniu nadal będziesz mieć plik, który będziesz musiał ręcznie usunąć.
terdon
2
Odradzam tutaj FIFO, ponieważ proces serwera może się zawiesić, jeśli bufor FIFO zostanie zapełniony, gdy nikt nie zażąda (więcej) danych dziennika. Jeśli rozmiar pliku dziennika staje się problemem, naprawdę powinieneś użyć odpowiedniego pliku dziennika plus logrotate.
David Foerster
@terdon Jak powiedziałeś, jedynym punktem jest zapisywanie dysku, myślałem, że OP nie chce, aby jego logi były zapisywane na dysku.
Ravexina,
@DavidFoerster +1 Good Point;)
Ravexina