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 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
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
답변
파일이 추가되거나 제거되면 종료 될 것으로 예상됩니다.
나는 당신이 inotify-tools 후에 있다고 확신합니다 .
procps-ng의 watch 에 대한 내 맨 페이지에 따르면
watch는 명령을 반복적으로 실행하여 출력과 오류를 표시합니다 (첫 번째 화면 가득 참) .