Có phải đồng hồ chỉ theo dõi đầu ra có thể nhìn thấy?


12

watchchỉ giám sát đầu ra có thể nhìn thấy của một lệnh? Nói rằng tôi đang ở trong một thư mục có nội dung sau:

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

Nếu tôi chạy, watch -g ls -1tôi hy vọng nó sẽ thoát nếu một tệp được thêm hoặc xóa. Điều thực sự xảy ra là nó chỉ thoát nếu tệp đang được đề cập hiển thị trong đầu ra cuối của watch:

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

a
b
c
d
e
f

Xóa các tập tin mkhông thể nhìn thấy vì kích thước của thiết bị đầu cuối của tôi, không có gì. Xóa một tập tin có thể nhìn thấy, nói d, nguyên nhân watchđể thoát như mong đợi.

Các -gcờ được giải thích thusly trong tôi mantrang:

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

Chuyện gì đang xảy ra vậy? Điều này có bình thường không? Làm thế nào tôi có thể sử dụng watchcho các lệnh với đầu ra dài? Tôi đang sử dụng watch from procps-ng 3.3.4được cài đặt từ repos Debian.


Không những gì -gtùy chọn để watchlàm gì? Tôi không tìm thấy nó trong phiên bản của tôiwatch
iruvar

@ 1_CR xem câu hỏi được cập nhật, nó sẽ khiến nó thoát ra khi đầu ra thay đổi. Nó hoạt động như quảng cáo khi thay đổi hiển thị trên màn hình.
terdon

Câu trả lời:


9

Tôi tìm thấy chủ đề này có tiêu đề: Bug # 225549: có màn hình stderr . Chủ đề đó có từ năm 2008, nhưng có vẻ như các phiên bản cũ hơn không hỗ trợ xem bất cứ thứ gì ngoài STDOUT.

Vì vậy, chúng tôi giới hạn chỉ STDOUT. Như có thể thấy, có rất nhiều ngôn ngữ trong info watchman watchđiều đó khiến tôi nghĩ rằng quan sát / giả định của bạn là chính xác.

đoạn trích

   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.

Ngoài ra bit này dưới 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.

Nếu tôi phải đoán tôi sẽ nghĩ rằng họ đang lưu trữ các bit có thể nhìn thấy trong một bộ đệm giữa các lần chạy, và sau đó chỉ phân tích các ký tự đó.

EDIT # 1

Tôi đã gỡ lỗi điều này hơn nữa bằng cách sử dụng stracevà bạn có thể thấy watchviệc đọc đầu ra từ lslệnh để nó thay đổi bên trong.

trước khi tôi xóa mtập tin

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

sau khi mtập tin bị xóa

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

Vâng, nó có vẻ kỳ lạ, nó làm cho nó không thể chạy một cái gì đó như thế watch -g foo; echo "Something changed!". Có vẻ như một lỗi làm tê liệt kỳ lạ trong một chương trình được thiết lập như vậy.
terdon

@terdon - Phiên bản Fedora cổ của tôi không có công -gtắc nhưng tôi đã thử nó trên Ubuntu và nó cũng hoạt động tương tự.
slm

OK, điều đó thực sự kỳ lạ. Vì vậy, nó thực sự theo dõi và thấy sự thay đổi, nó chỉ không phản ứng với nó! Chắc chắn là một lỗi rồi.
terdon

2

Tôi hy vọng nó sẽ thoát nếu một tập tin được thêm hoặc xóa

Tôi khá chắc chắn rằng bạn sau khi công cụ inotify .

Trang của tôi để xem , từ Procps-ng , nói

xem chạy lệnh liên tục, hiển thị đầu ra và lỗi của nó (màn hình đầu tiên) .


Đó không phải là những gì anh ấy hỏi, anh ấy đang cố gắng hiểu hành vi của một bản cập nhật xảy ra, được hiển thị qua STDOUT, nhưng không thể nhìn thấy trong thiết bị đầu cuối. Anh ấy đã thay đổi kích thước để đầu ra bị thay đổi bị "tắt màn". Hầu hết mọi người tôi đã thảo luận điều này với ngày hôm nay sẽ mong đợi watchhành xử như OP và thoát khỏi sự thay đổi.
slm

Có, chúng tôi cũng đã thảo luận về điều đó, tôi nhấn mạnh cùng một văn bản trong câu trả lời của tôi. Tôi biết Terdon khá rõ và tại thời điểm này anh ấy muốn biết lý do tại sao.
slm

Tôi đồng ý đó không phải là câu trả lời cho câu hỏi của anh ấy, nhưng đó là giải pháp cho vấn đề của anh ấy.
jthill

Bạn có nghĩa là sử dụng inotify? Đó không phải là những gì anh ấy theo đuổi, anh ấy muốn biết tại sao lại watchcư xử theo cách này. Anh ấy biết về inotify.
slm

Đó là câu hỏi của anh ấy. Những gì anh ấy đang cố gắng làm với nó là những gì tôi đã trích dẫn: chờ đợi một tập tin được thêm hoặc xóa. Đồng hồ không phải là công cụ cho công việc đó.
jthill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.