Apakah arloji hanya memantau output yang terlihat?

12

Apakah watchhanya memonitor output perintah yang terlihat? Katakan saya di direktori dengan konten berikut:

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

Jika saya menjalankan, watch -g ls -1saya berharap untuk keluar jika file ditambahkan atau dihapus. Apa yang sebenarnya terjadi adalah bahwa ia keluar hanya jika file tersebut terlihat di output terminal watch:

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

a
b
c
d
e
f

Menghapus file m, yang tidak terlihat karena ukuran terminal saya, tidak melakukan apa-apa. Menghapus file yang terlihat, katakanlah d, menyebabkan watchkeluar seperti yang diharapkan.

The -gflag dijelaskan thusly di saya manhalaman:

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

Apa yang sedang terjadi? Apakah ini normal? Bagaimana saya bisa menggunakan watchuntuk perintah dengan output panjang? Saya menggunakan watch from procps-ng 3.3.4yang diinstal dari repo Debian.

terdon
sumber
Apa -gpilihan yang harus watchdilakukan? Saya tidak menemukannya dalam versi sayawatch
iruvar
@ 1_CR lihat pertanyaan yang diperbarui, itu harus menyebabkannya keluar ketika output berubah. Ini berfungsi seperti yang diiklankan ketika perubahan terlihat di layar.
terdon

Jawaban:

9

Saya menemukan utas ini berjudul: Bug # 225549: have watch monitor stderr . Utas itu dari 2008, tetapi sepertinya versi yang lebih lama tidak mendukung tontonan selain STDOUT.

Jadi kita terbatas hanya STDOUT. Adapun yang terlihat ada banyak bahasa di dalamnya info watchdan man watchitu membuat saya berpikir pengamatan / asumsi Anda benar.

kutipan

   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.

Juga bit ini di bawah 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.

Jika saya harus menebak saya akan berpikir mereka menyimpan bit yang terlihat dalam buffer di antara run, dan kemudian menganalisis hanya karakter tersebut.

EDIT # 1

Saya memperdebatkan ini menggunakan lebih lanjut stracedan Anda dapat melihat watchmembaca output dari lsperintah sehingga secara internal menjatuhkan perubahan.

sebelum saya menghapus mfile

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

setelah mfile dihapus

--- 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
slm
sumber
Ya, sepertinya aneh, itu membuat tidak mungkin menjalankan sesuatu seperti watch -g foo; echo "Something changed!". Tampaknya bug yang melumpuhkan aneh dalam program yang didirikan.
terdon
@terdon - versi kuno saya dari Fedora tidak memiliki -gsaklar tetapi saya mencobanya di Ubuntu dan berperilaku sama.
slm
OK, itu benar - benar aneh. Jadi itu benar-benar memonitor dan melihat perubahan, itu hanya tidak bereaksi! Pasti itu bug.
terdon
2

Saya berharap untuk keluar jika file ditambahkan atau dihapus

Saya cukup yakin Anda mencari alat inotify .

Halaman manual saya untuk menonton , dari procps-ng , mengatakan

watch menjalankan perintah berulang kali, menampilkan output dan kesalahannya (layar penuhl pertama) .

jthill
sumber
Bukan itu yang dia tanyakan, dia mencoba memahami perilaku pembaruan yang terjadi, ditampilkan melalui STDOUT, tetapi tidak terlihat di terminal b / c dia mengukur ulang sehingga output yang sedang diubah "mati layar". Kebanyakan orang yang saya diskusikan dengan hari ini diharapkan watchberperilaku sebagai OP, dan keluar dengan perubahan.
slm
Ya kita sudah membahasnya juga, saya menyoroti teks yang sama dalam jawaban saya. Saya tahu Terdon cukup baik dan pada titik ini ia ingin tahu alasannya.
slm
Saya setuju itu bukan jawaban untuk pertanyaannya, tetapi itu adalah solusi untuk masalahnya.
jthill
Maksud Anda menggunakan inotify? Bukan itu yang dia kejar, dia ingin tahu mengapa watchberperilaku seperti ini. Dia tahu tentang tidak mengizinkan.
slm
Itu pertanyaannya. Apa yang dia coba lakukan dengan itu adalah apa yang saya kutip: tunggu file ditambahkan atau dihapus. Watch bukanlah alat untuk pekerjaan itu.
jthill