시계는 보이는 출력 만 모니터링합니까? i j

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플래그 내에서 thusly 히 설명 man페이지 :

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

무슨 일이야? 이것이 정상입니까? watch출력이 긴 명령에 어떻게 사용할 수 있습니까? watch from procps-ng 3.3.4데비안 저장소에서 설치된 것을 사용 하고 있습니다.



답변

이 스레드가 Bug # 225549 : have watch monitor stderr 이라는 제목의 스레드를 찾았습니다 . 이 스레드는 2008 년부터 시작되었지만 이전 버전에서는 STDOUT 이외의 다른 기능을 지원하지 않는 것 같습니다.

따라서 우리는 단지 STDOUT으로 제한됩니다. 볼에 관해서는 거기에 언어의 많은입니다 info watchman 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
       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볼 수 있으므로 내부적으로 변경 사항을 삭제합니다.watchls

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

답변

파일이 추가되거나 제거되면 종료 될 것으로 예상됩니다.

나는 당신이 inotify-tools 후에 있다고 확신합니다 .

procps-ng의 watch 에 대한 내 맨 페이지에 따르면

watch는 명령을 반복적으로 실행하여 출력과 오류를 표시합니다 (첫 번째 화면 가득 참) .