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 저장소에서 설치된 것을 사용하고 있습니다.
답변1
다음과 같은 제목의 게시물을 찾았습니다.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
디버깅을 위해 추가로 사용했고 read 명령의 출력을 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
답변2
파일을 추가하거나 제거하면 종료하고 싶습니다.
난 당신이 쫓고 있다고 확신해요이노티파이 도구.
내 맨페이지보다, 에서procps-ng,설명하다
watch는 명령을 반복적으로 실행하여 출력과 오류를 표시합니다.(첫화면 전체화면).