Czy istnieje wersja stronicowania programu „watch”?


24

Jak mogę uzyskać pod powłoką UNIX podobny efekt do watchpolecenia, ale ze stronicowaniem, aby móc przewijać dane wyjściowe, jeśli zajmie to więcej niż jeden ekran?

Innymi słowy, chcę program, który jest do watchtego, co lessjest cat.

Jako przykład, powiedzmy, że chciałem obejrzeć wynik qstat, którego mógłbym użyć

watch qstat

aby obejrzeć wyjście qstat, ale to pokazuje tylko pierwszy screen.

W wersji stronicowania watch, byłbym w stanie poruszać się w danych wyjściowych, ponieważ są one ciągle aktualizowane przez watch. Czy w tej chwili można to zrobić za pomocą istniejących narzędzi?


To prawdopodobnie należy do SuperUser lub może ServerFault.

Prawdopodobnie masz rację, jak mogę to przenieść?
David Dean,

Jak dotąd trzy osoby głosowały za jej przeniesieniem; jeśli dwie kolejne osoby (lub moderator) głosują za jego przeniesieniem, nastąpi to automatycznie.
Greg Hewgill,

Dlaczego po prostu nie otworzyć większego okna i całkowicie zrezygnować ze stronicowania?
Marcin,

1
ponieważ mój ekran jest już pełny? lesspo co korzystać, kiedy można po prostu użyć cati większe okno?
David Dean

Odpowiedzi:


18

Zamiast modyfikować polecenie „obserwuj”, użyj screena!

Załóżmy na przykład, że musisz widzieć 300 linii wysokości i 100 znaków szerokości i poruszać się po tym. Po uruchomieniu ekranu wymuś rozmiar w ten sposób:

C-a :height -w 300
C-a :width -w 100

Teraz uruchom polecenie zegarka. Następnie można użyć C-a <ESC>do przewijania strony wyświetlacza.

Niestety ekran nie jest odświeżany w trybie kopiowania. Ale jeśli chcesz dostosować sekcję okna, które przeglądasz, najłatwiejszym sposobem może być ponowne uruchomienie poleceń wysokości / szerokości, ponieważ domyślnie terminal wyświetla prawą dolną część wirtualnego okna.


jedynym problemem jest więc ciągłe powtarzanie polecenia, przy jednoczesnym wygaszaniu ekranu między każdym przejazdem
David Dean,

Ups, miałem na myśli uruchomienie komendy oglądania na ekranie. Naprawiony.
MikeyB,

yartls - kolejny powód do kochania ekranu :)
warren

zauważ, że C-to akactrl-
henry

5

Możesz spróbować:

podczas gdy vmstat; śpij 1; zrobione | mniej

zamień vmstat na qstat i dostosuj tryb uśpienia do swoich potrzeb


wszystko to polega na powtarzaniu polecenia less, co oznacza, że ​​musisz przewijać, aby zobaczyć najnowsze dane wyjściowe.
David Dean

Tak, ale możesz przewinąć do tyłu. Nie możesz mieć obu naraz. Naciśnięcie klawisza shift f, czyli dużej litery „F”, będzie działało jak ogon.
Spacen Jasset


2

OK, miałem trochę czasu na watchlessfunkcję. Jest trochę szorstki i nie wydaje się jeszcze w pełni działać, ale oto:

#!/bin/bash -u
out=$(mktemp)
(while [ 1 ]; do
    "$@" > $out;
    sleep 2;
done) &
less $out
kill $!

Musisz ręcznie użyć Rklawisza w mniej, aby zaktualizować wyświetlacz.

Wygląda na to, że działa dla, watchless dateale nie dla watchless qstatlub watchless pstree, i oba pokazują puste. Jakieś pomysły?


Powinieneś użyć drugiego pliku, aby zapisać dane wyjściowe następnego uruchomienia polecenia, a następnie mvten drugi plik do pliku odczytanego lessjako as mvatomowy. W przeciwnym razie lessmógłby pomyśleć, że plik zniknął, jeśli żądanie odświeżenia jest wymagane w tym samym czasie, w którym zapisywany jest plik "$@" > $out. Przed uruchomieniem pętli powinieneś również zapisać plik wyjściowy.
Aurélien Ooms

0

Nie widzę, jak można to zaimplementować, gdy zmienia się zawartość wiersza, i watchresetuje się z powrotem do pierwszej linii co 2 sekundy, nawet jeśli można przewinąć w dół.

Niektóre obejścia:

watch 'qstat | tail -n40' aby wyświetlić wyjście qstat zaczynające się od 40 linii od dołu

watch 'qstat | grep jsmith' aby grepować dane wyjściowe, aby linie, którymi jesteś zainteresowany, były zawsze na pierwszym ekranie.

Zauważ, że musisz umieścić polecenia wokół potoku w pojedynczych cudzysłowach - w przeciwnym razie będziesz przesyłać dane wyjściowe watch, a nie wyjściowe qstat.


0

Aby kontynuować odpowiedź enkrsa,

oglądać „qstat | głowa -300 | ogon -15 '

dostarczy ci dowolne strony do wyjścia qstat.


0

Oto dość prymitywny skrypt, który wydaje się działać dla kilku poleceń, które mu rzuciłem

#!/bin/bash
# ---- mywatch.sh ----

if [ $# -lt 1 && $# -gt 2 ]; then
    echo "Usage: $0 <command> <delay>" 
    exit 1
fi

CMD=$1
if [ $# -eq 2 ]; then
  DELAY=$2
else
  DELAY=2 # default
fi

while : ; do
  ( (echo -e "Every ${DELAY}s: $CMD\n"; $CMD) | less )&
  PID=$!
  sleep $DELAY
  kill -9 $PID &> /dev/null
  clear
done

Używany jako taki:

alias mywatch="~/bin/mywatch.sh"

mywatch vmstat
mywatch "ps aux" # commands in options need to be quoted
mywaych pstree 10 # change delays

Będąc raczej pedantycznym, przejście między odświeżeniami nie jest tak płynne, jak bym tego chciał. Oczywiście, będąc prostym skryptem, nie obsługuje podświetlenia diff (watch -d). Ponadto parsowanie argumentów wejściowych można wykonać lepiej.



0

Implementuję prosty skrypt Pythona, aby spełnić to żądanie, o nazwie „watchall”

pobierz: pip install watchall

zamień zegarek na watchall i ciesz się przewijanym ekranem. teraz obsługuje tylko flagi -n i -d.


-1

możesz spróbować:

watch command > file

wtedy w twoim pliku powinieneś zobaczyć wyjście dołączające (nie mam teraz prawa do Linuksa, żeby to przetestować)


1
To nie zrobi tego, co zamierzałeś, naprawdę, po prostu wypełni się filetą samą wydajnością w kółko. Z pewnością nie odnosi się do pierwotnego pytania.
Greg Hewgill,

potem nie wiem :)

1
Zmienić „>” na „>>”, aby dodać dane do pliku?
Rory,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.