watch コマンド

コマンドを一定の時間ごとに実行して結果を端末にスクロールさせずに固定で表示してくれるコマンド。

## `ls -al` を1秒ごとに実行
$ watch -n 1 ls -al

-n1 のようにつなげてもよい。-n0.1 で0.1秒ごとに実行になる。 0.1秒よりも細かい精度では指定できない気がする。

オプション

-c
色表示に対応してくれる。
-d
変化した部分を強調して表示される。
-e
コマンドがエラー終了したらそれ以降はコマンドを実行しない
-g
コマンドの出力に変化があったらwatchを終了する
-n <秒数>
実行間隔を指定する。nと数字の間はスペースがなくてもよい。
-t
普通は1行目にwatchの情報として実行間隔や実行しているコマンドを表示しているが、 このオプションを付けると、非表示になる。

-c, -e, -g は環境によって使える場合と使えない場合があるようで、手元の Ubuntu 14.04 では使えたが CentOS 6.3 では使えなかった。

バージョンによる違い

このコマンドを提供しているプロジェクトがもともとは procps というところで、それをforkしたものが procps-ng。 CentOS 6では本家 procps を使っていて、Ubuntu や CentOS 7 では procps-ng を使っている。

たぶん、-e-g は procps-ng になってからのオプション。

コマンドの中にワイルドカードを使いたい場合

バッチ処理かなにかで .txt という拡張子を持つファイルが作られたり消されたりするとして、その様子をリアルタイムに監視するために ls -al *.txt というコマンドを常時表示させたいとする。そのとき、

$ watch -n1 ls -al *.txt

と書いてしまうと、watchコマンドを開始する前に *.txt の展開をして、 watchコマンドからは毎秒同じ展開結果でlsコマンドを実行してしまい、意図した結果にならない。

以下のようにコマンド全体をクオーテーションなどで囲むとよい。

$ watch -n1 "ls -al *.txt"

パイプが含まれている場合

実行したいコマンドにパイプが含まれている場合、そのまま watch の後ろに書くと watch コマンド自体の出力をパイプしてしまうので、以下のように実行コマンド全体をダブルクオーテーションなどで囲む。

## ファイルの数を3秒ごとに監視
$ watch -n 3 "ls | wc -l"

コマンドの出力に色をつけるには

実行するコマンドがカラーで表示しようとする場合でも、watchコマンドはデフォルトではカラー表示してくれない。

$ watch -n1 ls -al --color

これを実行するとエスケープシーケンスがあらわに表示されて残念な感じになる。

こういうときUbuntuやCentOS 7では -c オプションが使える。

$ watch -n1 -c ls -al --color
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。