¿Watch solo monitorea la salida visible?

12

¿ watchSolo monitorea la salida visible de un comando? Digamos que estoy en un directorio con los siguientes contenidos:

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

Si ejecuto watch -g ls -1, espero que salga si se agrega o elimina un archivo. Lo que realmente ocurre es que salga solamente si el archivo en cuestión es visible en la salida del terminal de watch:

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

a
b
c
d
e
f

Eliminar el archivo m, que no es visible debido al tamaño de mi terminal, no hace nada. Suprimir un archivo visible, por ejemplo d, hace watchque salga como se esperaba.

La -gbandera se explica así en mi manpágina:

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

¿Que esta pasando? ¿Esto es normal? ¿Cómo puedo usar watchpara comandos con salida larga? Estoy usando el watch from procps-ng 3.3.4que se instaló desde los repositorios de Debian.

terdon
fuente
¿Qué hace la -gopción de watchhacer? No lo encuentro en mi versión dewatch
iruvar
@ 1_CR vea la pregunta actualizada, debería hacer que salga cuando cambie la salida. Funciona como se anuncia cuando el cambio es visible en la pantalla.
terdon

Respuestas:

9

Encontré este hilo titulado: Bug # 225549: have watch monitor stderr . Ese hilo es de 2008, pero parece que las versiones anteriores no admiten la visualización de otra cosa que no sea STDOUT.

Por lo tanto, estamos limitados a STDOUT. En cuanto a lo visible, hay mucho lenguaje en el info watchy man watcheso me hace pensar que su observación / suposición es correcta.

extracto

   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.

También este bit bajo BUGS:

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.

Si tuviera que adivinar, pensaría que estaban almacenando los bits visibles en un búfer entre ejecuciones y luego analizando solo esos caracteres.

EDITAR # 1

Lo depuré más usando stracey puede ver la watchlectura del resultado del lscomando, por lo que internamente se descarta el cambio.

antes de eliminar el marchivo

$ 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) ---

después de meliminar el archivo

--- 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
slm
fuente
Sí, parece extraño, hace que sea imposible ejecutar algo así watch -g foo; echo "Something changed!". Parece un error extrañamente paralizante en un programa tan establecido.
terdon
@terdon: mi versión antigua de Fedora no tenía el -ginterruptor, pero lo probé en Ubuntu y se comporta igual.
slm
OK, eso es realmente extraño entonces. Por lo tanto, realmente monitorea y ve el cambio, ¡simplemente no reacciona a él! Definitivamente un error entonces.
terdon
2

Espero que salga si se agrega o elimina un archivo

Estoy bastante seguro de que buscas herramientas de inotify .

Mi página de manual para ver , de procps-ng , dice

watch ejecuta el comando repetidamente, mostrando su salida y errores (la primera pantalla completa) .

jthill
fuente
Eso no es lo que está preguntando, está tratando de entender el comportamiento de una actualización que se muestra a través de STDOUT, pero no es visible en el terminal b / c, lo ha redimensionado para que la salida que se está cambiando esté "desactivada" pantalla". La mayoría de las personas con las que he discutido esto hoy habrían esperado watchcomportarse como OP y salir con el cambio.
slm
Sí, ya lo hemos discutido también, destaqué el mismo texto en mi respuesta. Conozco a Terdon bastante bien y en este punto quiere saber por qué.
slm
Estoy de acuerdo en que no es la respuesta a su pregunta, pero es la solución a su problema.
2013
¿Te refieres a usar inotify? Eso no es lo que busca, quiere saber por qué se watchcomporta de esta manera. Él sabe sobre inotify.
slm
Esa es su pregunta. Lo que está tratando de hacer con eso es lo que cité: esperar a que se agregue o elimine un archivo. Watch no es la herramienta para ese trabajo.
2013