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


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

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

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


-g옵션 은 무엇입니까 watch? 내 버전에서 찾을 수 없습니다watch
iruvar

@ 1_CR 업데이트 된 질문을 참조하십시오. 출력이 변경되면 종료해야합니다. 변경 사항이 화면에 표시 될 때 알려진대로 작동합니다.
terdon

답변:


10

이 스레드가 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

예, 그것은 이상하게 보입니다 watch -g foo; echo "Something changed!". 와 같은 것을 실행하는 것은 불가능합니다 . 그러한 확립 된 프로그램에서 이상하게도 치명적인 버그로 보입니다.
terdon

@ terdon-Fedora의 고대 버전에는 -g스위치가 없었지만 우분투에서 시도했지만 동일하게 작동합니다.
slm

좋아, 그때 정말 이상해. 실제로 변경 사항을 모니터링하고 확인하지만 반응하지 않습니다! 확실히 버그입니다.
terdon

2

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

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

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

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


그것은 그가 요구하는 것이 아니며, STDOUT을 통해 표시되는 업데이트의 동작을 이해하려고 노력하고 있지만 터미널 b / c에는 보이지 않지만 변경되는 출력이 "꺼짐" 화면". 오늘이 문제에 대해 토론 한 대부분의 사람들 watch은 OP로 행동하고 변화를 끝낼 것으로 예상했을 것 입니다.
slm

예, 우리는 이미 그것에 대해서도 논의했습니다. 나는 같은 대답을 강조했습니다. 나는 Terdon을 상당히 잘 알고 있으며이 시점에서 그는 이유를 알고 싶어합니다.
slm

나는 그것이 그의 질문에 대한 답이 아니라 그의 문제에 대한 해결책이라는 데 동의합니다.
jthill

inotify를 사용한다는 의미입니까? 그것은 그가 추구하는 것이 아니며, 왜 watch이런 식으로 행동하는지 알고 싶어합니다 . 그는 inotify에 대해 알고 있습니다.
slm

그의 질문입니다. 그가 그것을하려고하는 것은 내가 인용 한 것입니다 : 파일이 추가되거나 제거 될 때까지 기다리십시오. 시계는 그 일을위한 도구가 아닙니다.
jthill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.