時計は目に見える出力のみを監視しますか?


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フラグはこのように私のmanページで説明されています:

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

どうしたの?これは正常ですか?watch出力が長いコマンドにはどのように使用できますか?watch from procps-ng 3.3.4Debianリポジトリからインストールされたものを使用しています。


-gオプションは何をwatchしますか?私は私のバージョンでそれを見つけることができませんwatch
iruvar

@ 1_CRは更新された質問を参照します。出力が変更されると終了します。変更が画面に表示されている場合、広告どおりに機能します。
テルドン

回答:


9

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

これをさらにデバッグしましたが、コマンドからの出力stracewatch読んでいる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

ええ、それは奇妙に思えwatch -g foo; echo "Something changed!"ます。このような確立されたプログラムでは、奇妙に不自由なバグのようです。
テルドン

@terdon-私の古いバージョンのFedoraには-gスイッチがありませんでしたが、Ubuntuで試してみましたが、動作は同じです。
SLM

OK、それは本当に奇妙です。したがって、実際に変更を監視して確認しますが、それには反応しません!間違いなくバグです。
テルドン

2

ファイルが追加または削除されると終了することを期待しています

私はあなたがinotify-toolsの後だと確信しています

procps-ngからのwatchの私のマンページは言います

watchはコマンドを繰り返し実行し、その出力とエラーを表示します(最初の画面いっぱい)


それは彼が尋ねているものではなく、STDOUT経由で表示されている更新の動作を理解しようとしていますが、端末b / cでは表示されず、変更されている出力が「オフ」になるようにサイズを変更しています画面"。今日私がこれについて議論したほとんどの人はwatch、OPとして振る舞うと期待し、変更で終了します。
slm

はい、私たちはすでにそれについても議論しました。答えで同じテキストを強調しました。私はテルドンをかなりよく知っていて、この時点で彼はその理由を知りたいと思っています。
slm

私はそれが彼の質問への答えではないことに同意しますが、それは彼の問題の解決策です。
jthill

inotifyを使用するということですか?それは彼が望んでいることではなく、彼はなぜwatchこのように振る舞うのかを知りたいと思っています。彼はinotifyについて知っています。
slm

それが彼の質問です。彼がそれでやろうとしているのは、私が引用したことです。ファイルが追加または削除されるのを待ちます。ウォッチはその仕事のためのツールではありません。
jthill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.