Чи стежить лише годинник за видимим виходом?


12

Чи watchконтролює лише видимий вихід команди? Скажіть, що я в каталозі з таким вмістом:

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

Якщо я запускаю, watch -g ls -1я очікую, що він закінчиться, якщо файл буде додано або видалено. Що насправді трапляється, це те, що він закривається, лише якщо відповідний файл видно у висновку терміналу watch:

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

a
b
c
d
e
f

Видалення файла m, який не видно через розмір мого терміналу, нічого не робить. Видалення видимого файлу, скажімо d, призводить watchдо виходу, як очікувалося.

-gПрапор пояснюється в моїй константи виглядає manсторінці:

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

Що відбувається? Це нормально? Як я можу використовувати watchкоманди з довгим висновком? Я використовую, watch from procps-ng 3.3.4який був встановлений з репонів Debian.


Що робить -gваріант watch? Я не знаходжу його у своїй версіїwatch
— iruvar

@ 1_CR див. Оновлене запитання, це повинно спричинити його вихід, коли результат зміниться. Це працює так, як рекламується, коли зміни видно на екрані.
— terdon

Відповіді:


10

Я знайшов цю тему під назвою: Bug # 225549: мати монітор годинника stderr . Цей потік з 2008 року, але схоже, що більш старі версії не підтримують перегляд нічого іншого, крім STDOUT.

Таким чином, ми обмежені лише STDOUT. Щодо видимого, в мові є багато мови, info watchі man watchце змушує мене думати, що ваше спостереження / припущення є правильним.

витяг

   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.

Також цей біт під 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.

Якби мені довелося здогадатися, я б подумав, що вони зберігають видимі біти в буфері між прогонами, а потім аналізують лише ті символи.

РЕДАКТИКА №1

Я відлаштував це далі за допомогою, straceі ви можете побачити, як watchчитати вихід з lsкоманди, так що це внутрішньо відміняє зміни.

перш ніж видалити mфайл

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

після mвидалення файлу

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

Так, це просто здається дивним, це робить неможливим запустити щось подібне watch -g foo; echo "Something changed!". Начебто дивно калічить помилка в такій усталеній програмі.
— тердон

@terdon - у моїй стародавній версії Fedora не було -gкомутатора, але я спробував його на Ubuntu, і він поводиться так само.
— slm

Гаразд, це справді дивно. Таким чином, він насправді відстежує та бачить зміни, він просто не реагує на це! Однозначно помилка тоді.
— тердон

2

Я очікую, що він завершиться, якщо файл буде додано або видалено

Я впевнений, що ви користуєтеся інструментами inotify-tools .

Моя сторінка для перегляду , від procps-ng , говорить

watch виконує команду неодноразово, відображаючи її вихід та помилки (перший екран) .


Це не те, про що він питає, він намагається зрозуміти поведінку оновлення, яке відбувається, відображаючись через STDOUT, але не видно в терміналі b / c, він переозброює його, щоб вихід, який змінюється, був "вимкнено екран ". Більшість усіх, з ким я сьогодні обговорював це, очікували б, що watchвони поводяться як ОП, і вийдуть зі зміною.
— slm

Так, ми вже це обговорювали, я виділив той самий текст у своїй відповіді. Я досить добре знаю Тердона, і в цей момент він хоче знати причину.
— slm

Я згоден, це не відповідь на його запитання, але це рішення його проблеми.
— jthill

Ви маєте на увазі використання inotify? Це не те, що він шукає, він хоче знати, чому так watchповодиться. Він знає про прищеплення.
— slm

Це його питання. Що він намагається зробити з цим - це те, що я цитував: чекайте, коли файл буде доданий або видалений. Дивитися не є інструментом для цієї роботи.
— jthill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.