Esiste una versione di paging di `watch`?


24

In una shell UNIX, come posso ottenere un effetto simile al watchcomando, ma con il paging in modo da poter scorrere nell'output se occupa più di una schermata?

In altre parole, voglio un programma che sia quello watchche lessè cat.

Ad esempio, diciamo che volevo guardare l'output di qstat, potrei usare

watch qstat

per guardare l'output di qstat, ma questo può mostrare solo il primo schermo.

Con una versione di paging di watch, sarei in grado di spostarmi nell'output in quanto è ancora continuamente aggiornato da watch. C'è un modo per farlo al momento con le utility esistenti?


Questo probabilmente appartiene a SuperUser o forse ServerFault.

Probabilmente hai ragione, come posso spostarlo?
David Dean,

Tre persone hanno votato per spostarlo finora; se altre due persone (o un moderatore) votano per spostarlo, accadrà automaticamente.
Greg Hewgill,

Perché non solo aprire una finestra più grande e andare via con il paging del tutto?
Marcin,

1
perché il mio schermo è già pieno? perché usare lessquando puoi semplicemente usare cate una finestra più grande?
David Dean,

Risposte:


18

Invece di modificare il comando 'watch', usa screen!

Ad esempio, supponiamo che devi essere in grado di vedere 300 linee di altezza e 100 caratteri di larghezza e spostarti. Dopo aver avviato la schermata, forzare le dimensioni in questo modo:

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

Ora avvia il comando watch. È quindi possibile utilizzare C-a <ESC>per sfogliare il display.

Sfortunatamente, il display non si aggiorna mentre è in modalità copia. Ma se si desidera regolare la sezione della finestra che si sta visualizzando, il modo più semplice potrebbe essere quello di rieseguire i comandi altezza / larghezza poiché, per impostazione predefinita, il terminale mostra la parte inferiore destra della finestra virtuale.


l'unico problema quindi è come ripetere continuamente il comando, mentre si oscura lo schermo tra ogni tentativo
David Dean,

Oops, intendevo eseguire il comando watch all'interno dello schermo. Fisso.
MikeyB,

yartls - ancora un altro motivo per amare lo schermo :)
warren

nota che C-è akactrl-
henry

5

Puoi provare questo:

mentre vmstat; dormire 1; fatto | Di meno

sostituire vmstat con qstat e adattare il sonno alle proprie esigenze


tutto ciò che fa è continuare a ripetere il comando in less, il che significa che è necessario continuare a scorrere per vedere l'ultimo output.
David Dean,

Sì, ma puoi scorrere indietro. Non puoi averli entrambi in una volta. Premendo maiusc f, cioè la 'F' maiuscola funzionerà come la coda.
Spacen Jasset,


2

OK, ho avuto un piccolo tentativo per una watchlessfunzione. È un po 'approssimativo e non sembra ancora funzionare completamente, ma ecco qui:

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

Devi usare manualmente la Rchiave in meno per ottenere l'aggiornamento del display.

Sembra funzionare per watchless datema non per watchless qstato watchless pstree, che mostrano entrambi vuoti. Qualche idea?


Dovresti usare un secondo file per scrivere l'output della prossima esecuzione del comando e quindi mvquesto secondo file nel file letto lesscome mvè atomico. Altrimenti si lesspotrebbe pensare che il file sia scomparso se viene richiesto un aggiornamento contemporaneamente alla scrittura del file "$@" > $out. È inoltre necessario scrivere una volta sul file di output prima di avviare il ciclo.
Aurélien Ooms,

0

Non vedo come questo potrebbe essere implementato mentre i contenuti della riga cambiano e watchsi ripristinerebbe alla prima riga ogni 2 secondi anche se si potesse scorrere verso il basso.

Alcune soluzioni alternative sono:

watch 'qstat | tail -n40' per mostrare l'output di qstat a partire dalla 40a riga dal basso

watch 'qstat | grep jsmith' per grep l'output in modo che le linee che ti interessano siano sempre nella prima schermata.

Nota che devi inserire i comandi attorno alla pipe tra virgolette singole, altrimenti eseguirai il piping dell'output di watch, non dell'output di qstat.


0

Per continuare con la risposta di enkrs,

guarda 'qstat | testa -300 | coda -15 '

ti porterà pagine arbitrarie nell'output di qstat.


0

Ecco uno script piuttosto grezzo che sembra funzionare per diversi comandi che ho lanciato

#!/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

Usato come tale:

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

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

Essendo piuttosto pedante, la transizione tra i rinfreschi non è così regolare come vorrei che fosse. Naturalmente, essendo un semplice script, non supporta l'evidenziazione di diff (watch -d). Inoltre, l'analisi degli argomenti di input può essere eseguita meglio.



0

Implemento un semplice script Python per soddisfare questa richiesta, denominato "watchall"

scaricalo da: pip install watchall

sostituisci l'orologio con watchall e goditi lo schermo scorrevole. ora supporta solo i flag -n e -d.


-1

Puoi provare:

watch command > file

quindi nel tuo file dovresti vedere l'output appendend (non ho un box Linux per ora per testarlo)


1
Questo non farà ciò che intendi, in realtà si riempirà sempre filecon lo stesso output. Certamente non affronta la domanda originale.
Greg Hewgill,

allora non so :)

1
Cambia ">" in ">>" per far aggiungere i dati al file?
Rory,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.