Watch monitora solo l'output visibile?


12

Non watchsolo monitorare l'uscita visibile di un comando? Di 'che sono in una directory con i seguenti contenuti:

$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n

Se corro, watch -g ls -1mi aspetto che esca se un file viene aggiunto o rimosso. Ciò che realmente accade è che esce solo se il file in questione è visibile nell'output del terminale di watch:

$ watch -g ls -1
Every 2.0s: ls -1                   Wed Nov 13 16:35:03 2013

a
b
c
d
e
f

L'eliminazione del file m, che non è visibile a causa delle dimensioni del mio terminale, non fa nulla. L'eliminazione di un file visibile, ad esempio d, provoca watchl'uscita come previsto.

La -gbandiera è così spiegata nella mia manpagina:

   -g, --chgexit
          Exit when the output of command changes.

Cosa sta succedendo? È normale? Come posso usare watchper comandi con output lungo? Sto usando watch from procps-ng 3.3.4quale è stato installato dai repository Debian.


Cosa fa l' -gopzione da watchfare? Non lo trovo nella mia versione diwatch
iruvar del

@ 1_CR vedi domanda aggiornata, dovrebbe causarne la chiusura quando l'output cambia. Funziona come pubblicizzato quando la modifica è visibile sullo schermo.
terdon

Risposte:


9

Ho trovato questa discussione intitolata: Bug # 225549: have watch monitor stderr . Quella discussione è del 2008, ma sembra che le versioni precedenti non supportino la visione di qualcosa di diverso da STDOUT.

Quindi siamo limitati al solo STDOUT. Per quanto riguarda visibile, c'è molto linguaggio nel info watche man watchciò mi fa pensare che la tua osservazione / assunzione sia corretta.

estratto

   watch runs command repeatedly, displaying its output (the first screen‐
   full).   This  allows you to watch the program output change over time.
   By default, the program is run every 2 seconds; use -n or --interval to
   specify a different interval.

Anche questo bit sotto BUG:

BUGS
       Upon  terminal resize, the screen will not be correctly repainted until
       the next scheduled update.  All --differences highlighting is  lost  on
       that update as well.

Se dovessi indovinare, penserei che stessero memorizzando i bit visibili in un buffer tra le esecuzioni e quindi analizzando solo quei caratteri.

EDIT # 1

Ho eseguito il debug di questo ulteriore utilizzo stracee puoi vedere la watchlettura dell'output dal lscomando in modo che la modifica venga annullata internamente.

prima di eliminare il mfile

$ strace -o w.log watch -g 'ls -1'
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\nw.lo"..., 4096) = 34
close(3)                                = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
munmap(0x7f4da83af000, 4096)            = 0
wait4(31011, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31011
rt_sigaction(SIGTSTP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, 8) = 0
write(1, "\33[H\33[2JEvery 2.0s: ls -1\33[1;140H"..., 119) = 119
rt_sigaction(SIGTSTP, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, NULL, 8) = 0
nanosleep({2, 0}, NULL)                 = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4da839f9d0) = 31014
close(4)                                = 0
fcntl(3, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4da83af000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\nw.lo"..., 4096) = 34
close(3)                                = 0
munmap(0x7f4da83af000, 4096)            = 0
--- SIGCHLD (Child exited) @ 0 (0) ---

dopo che il mfile è stato eliminato

--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigaction(SIGTSTP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, 8) = 0
poll([{fd=0, events=POLLIN}], 1, 0)     = 0 (Timeout)
poll([{fd=0, events=POLLIN}], 1, 0)     = 0 (Timeout)
write(1, "\33[1;158H8\33[11;163H", 18)  = 18
rt_sigaction(SIGTSTP, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, NULL, 8) = 0
nanosleep({2, 0}, NULL)                 = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4da839f9d0) = 31028
close(4)                                = 0
fcntl(3, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4da83af000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nn\nw.log\n", 4096) = 32
close(3)                                = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
munmap(0x7f4da83af000, 4096)            = 0
wait4(31028, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31028

Sì, sembra strano, rende impossibile eseguire qualcosa del genere watch -g foo; echo "Something changed!". Sembra un bug stranamente paralizzante in un programma così consolidato.
Terdon

@terdon - la mia antica versione di Fedora non aveva lo -gswitch ma l'ho provato su Ubuntu e si comporta allo stesso modo.
slm

OK, allora è davvero strano. Quindi controlla e vede il cambiamento, non reagisce! Sicuramente un bug quindi.
terdon

2

Mi aspetto che esca se un file viene aggiunto o rimosso

Sono abbastanza sicuro che stai cercando inotify-tools .

La mia manpage di watch , da procps-ng , dice

watch esegue ripetutamente il comando, visualizzando output ed errori (il primo schermo) .


Non è quello che sta chiedendo, sta cercando di capire il comportamento di un aggiornamento in corso, visualizzato tramite STDOUT, ma non è visibile nel terminale b / c, lo sta ridimensionando in modo che l'output che viene modificato sia "off schermo". La maggior parte delle persone con cui ho discusso oggi si sarebbe aspettato watchdi comportarsi come il PO e uscire con il cambiamento.
slm

Sì, ne abbiamo già discusso, ho evidenziato lo stesso testo nella mia risposta. Conosco Terdon abbastanza bene e a questo punto vuole sapere il motivo.
slm

Sono d'accordo che non è la risposta alla sua domanda, ma è la soluzione al suo problema.
jillill

Intendi usare inotify? Non è quello che sta cercando, vuole sapere perché watchsi comporta in questo modo. Sa di inotificare.
slm

Questa è la sua domanda. Quello che sta cercando di fare è quello che ho citato: attendere che un file venga aggiunto o rimosso. Guarda non è lo strumento per quel lavoro.
jillill
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.