Czy zegarek monitoruje tylko widoczne wyjście?


12

Czy watchmonitoruje tylko widoczny wynik polecenia? Powiedz, że jestem w katalogu z następującą zawartością:

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

Po uruchomieniu watch -g ls -1oczekuję, że zakończy się, jeśli plik zostanie dodany lub usunięty. W rzeczywistości dzieje się tak, że kończy działanie tylko wtedy, gdy dany plik jest widoczny na wyjściu terminalowym watch:

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

a
b
c
d
e
f

Usunięcie pliku m, który nie jest widoczny ze względu na rozmiar mojego terminala, nic nie robi. Usunięcie widocznego pliku, powiedzmy d, powoduje watchzakończenie zgodnie z oczekiwaniami.

-gFlaga jest wyjaśnione thusly w mojej manstronie:

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

Co się dzieje? Czy to normalne? Jak korzystać watchz poleceń o długim wyniku? Używam, watch from procps-ng 3.3.4który został zainstalowany z repozytoriów Debiana.


Co robi -gopcja watch? Nie znajduję tego w mojej wersjiwatch
iruvar,

@ 1_CR patrz zaktualizowane pytanie, powinno spowodować jego zamknięcie, gdy zmieni się wyjście. Działa zgodnie z reklamą, gdy zmiana jest widoczna na ekranie.
terdon

Odpowiedzi:


10

Znalazłem ten wątek: Bug # 225549: have watch monitor stderr . Wątek pochodzi z 2008 roku, ale wygląda na to, że starsze wersje nie obsługują oglądania niczego innego niż STDOUT.

Jesteśmy więc ograniczeni tylko do STDOUT. Jeśli chodzi o widoczne jest dużo w języku info watchi man watchże każ mi myśleć twój obserwacja / założenie jest prawidłowe.

fragment

   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.

Również ten fragment pod BŁĘDAMI:

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.

Gdybym musiał zgadywać, pomyślałbym, że przechowują widoczne fragmenty w buforze między seriami, a następnie analizują tylko te znaki.

EDYCJA 1

Debugowałem to dalej za pomocą stracei możesz zobaczyć watchodczyt danych wyjściowych z lspolecenia, aby wewnętrznie porzucić zmianę.

zanim usunę mplik

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

po usunięciu mpliku

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

Tak, wydaje się to po prostu dziwne, uniemożliwia uruchomienie czegoś takiego watch -g foo; echo "Something changed!". Wydaje się to dziwnie paraliżującym błędem w tak ustalonym programie.
terdon

@terdon - moja starożytna wersja Fedory nie miała -gprzełącznika, ale wypróbowałem go na Ubuntu i zachowuje się tak samo.
slm

OK, to naprawdę dziwne. Więc faktycznie monitoruje i widzi zmianę, po prostu nie reaguje na to! Zdecydowanie błąd.
terdon

2

Oczekuję, że zakończy się, jeśli plik zostanie dodany lub usunięty

Jestem pewien, że szukasz narzędzi inotify .

Mówi moja strona do oglądania z procps-ng

Watch uruchamia komendę wielokrotnie, wyświetlając jej dane wyjściowe i błędy (pierwszy screenfull) .


Nie o to pyta, próbuje zrozumieć zachowanie aktualizacji, wyświetlanej za pośrednictwem STDOUT, ale nie jest widoczny w terminalu b / c, zmienia jej rozmiar, aby zmieniane wyjście było „wyłączone” ekran". Większość osób, z którymi dzisiaj rozmawiałem na ten temat, spodziewałaby się, że będzie watchzachowywać się jak OP i wyjdzie ze zmianą.
slm

Tak, już to omawialiśmy, w odpowiedzi zaznaczyłem ten sam tekst. Znam Terdona dość dobrze i w tym momencie chce wiedzieć, dlaczego.
slm

Zgadzam się, że to nie jest odpowiedź na jego pytanie, ale rozwiązanie jego problemu.
jthill

Masz na myśli użycie inotify? Nie o to mu chodzi, chce wiedzieć, dlaczego tak się watchzachowuje. On wie o inotify.
slm

To jego pytanie. To, co próbuje z tym zrobić, to to, co zacytowałem: poczekaj, aż plik zostanie dodany lub usunięty. Zegarek nie jest narzędziem do tego zadania.
jthill
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.