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


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.