watchdiff -- cdif wrapper for monitoring command result

最近、gitbub で iij/watch というコマンドがひっそりと公開されました。 管理者の yasuoka 君は以前の同僚で、このコマンドは2000年に一緒の部署で働いていた時にみんなで作ったものですね。 元々は BSD/OS に watch というコマンドがあって、ちょっと拡張しようといじってたら結局作り直しちゃったやつです。 ずっと社内で使っていたものを公開したのには何か理由があるようですが、詳しいことは知りません。

このコマンドの機能は、指定したコマンドを定期的(デフォルトでは2秒おき)に実行して結果を画面に出すだけです。 少し工夫してあって、変更された部分を反転できるようになってたり、 出力が画面に入り切らない時には、スクロールして見ることもできます。

たいしたものではないけど意外と便利で、今でもたまに使ったりします。 たとえば、こんな感じ。

  • WiFi の電波が取れないなー、なんでかな〜てな時

    watch ifconfig -a

  • やっべー、ディスクぎりぎりだよ、足りるかあ〜てな時

    watch df

  • ネットワーク調子悪いなあ、なんか起こってるのかしらん?てな時

    watch netstat -s

まあ、これでもいいんだけど、反転だけではどうも色気がないんですね。 ncurses は色にも対応しているようなので、そういうの使うという手もあるのだけど、変更部分を調べる仕組みが単純に作ってあるので、行が増えたり減ったりすると途端にお手上げなわけです。

だったら、せっかく cdif で色が出るようにしたんだから、それを使えばいいじゃんということで作ってみました。 こんな感じの画面が2秒おきに表示されると考えておくんなさい。 cdif の変更点は、単に余計な部分を表示しないようにしただけです。 あ、実装言語は Perl ですよ。

f:id:uta46:20140215223419p:plain

似たようなツールはほかにもたくさんありそうですけどね。 watchdiff は、デフォルトでは垂れ流しモードなので、画面を書き換えずにスクロールしていきます。 最近はマルチウィンドウ環境が前提なので、その方が案外使いやすい場面も多いのではないかと思います。

しかし、en0 と連動する p2p0 ってインタフェースは一体何なんでしょうか? などという今まで気にもしなかかったことも、ビジュアル化することで気がついたりするわけです。 どうも、AirDrop と関係があるくさいです。

ちなみに watch コマンドで同じような画面を見ると、こうなります。 これでは、どこが変わったのかさっぱりわかりません。 ubuntu にも watch コマンドがあるらしいですが、それだとどう見えるのか気になるところです。

f:id:uta46:20140215232114p:plain

即席なので実装は粗粗、マニュアルテキトー。 特に端末制御周りは手抜きで、OS X 以外で動くかどうかはかなり怪しいです。 何かあったら github の issues でもなんでも適当にどうぞ。

NAME

watchdiff - repeat command and watch the differences

SYNOPSIS

watchdiff option -- command

Options:

    --refresh=#     refresh screen count (default 0)
    --interval=#    interval time between execution in second (default 2)
    --count=#       command repeat count (default 1000)
    --[no]date      show date at the beginning (default on)
    --[no]silent    do not show same result (default off)
    --[no]newline   print newline after command result (default on)
    --exec          set executing commands
    --diff=command  diff command used to compare result

Example:

    watchdiff df

    watchdiff --silent df

    watchdiff --refresh 5 --noclear -- df

    watchdiff --refresh 1 -- netstat -s -p ip

    watchdiff --refresh 1 --exec uptime --exec iostat --exec df

    watchdiff -s --refresh 1 --diff 'sdif --cdif -U100' -- netstat -sp ip

    watchdiff --nodate --nonewline --count=18 --interval=10 date

DESCRIPTION

Please install cdif(1) command as a default backend.

AUTHOR

Kazumasa Utashiro

https://github.com/kaz-utashiro/watchdiff

SEE ALSO

diff(1), cdif(1), sdif(1)

COPYRIGHT

Use and redistribution for ANY PURPOSE are granted as long as all copyright notices are retained. Redistribution with modification is allowed provided that you make your modified version obviously distinguishable from the original one. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED.