watch コマンド入門 - コマンドを定期実行して変化を監視する

watch コマンド入門 - コマンドを定期実行して変化を監視する

この記事でわかること

  • watch同じコマンドを一定間隔で繰り返し実行 できるようになる
  • -n(間隔)と -d(差分強調)という よく使う 2 つのオプション が分かる
  • パイプやリダイレクトを使うときの クォートの落とし穴 を避けられる
  • 監視を 正しく終了する方法(Ctrl + C)が分かる

結論(先に要点)

  • watch コマンド → 2 秒ごとに繰り返し実行して画面を更新
  • 間隔を変えるなら watch -n 5 コマンド(5 秒ごと)
  • 変わった部分を光らせたいなら watch -d コマンド
  • パイプ | を使うときは watch 'ls | wc -l' のように クォートで囲む

前提(対象環境)

  • OS:Linux(Ubuntu / Debian / RHEL 系など)
  • watchprocps-ng パッケージに含まれ、多くのディストリで標準インストール済み
  • macOS には標準では入っていない(必要なら brew install watch

1. watch コマンドとは?

結論: watch は指定したコマンドを一定間隔(既定 2 秒)で繰り返し実行し、最新の出力を画面に上書き表示するツール。変化の監視に使う。

リナ: 先輩、ファイルのサイズが増えてるか確認したくて、何回も ls -l を打ってるんですけど…これ面倒すぎませんか?
ライニー先輩: それ、watch の出番だね。watch は同じコマンドを自動で繰り返し実行して、画面を更新し続けてくれるんだ。手で連打しなくてよくなるよ。
リナ: 自動で繰り返してくれる!便利そう。どうやって使うんですか?
ライニー先輩: 監視したいコマンドの前に watch を付けるだけ。まずは一番シンプルな形から見ていこう。

2. 基本の使い方 - watch でコマンドを繰り返す

結論: watch コマンド と書くだけ。既定では 2 秒ごとに実行され、画面上部に間隔・実行コマンド・時刻が表示される。

リナ: さっきの ls -l で試してみます。
ライニー先輩: いいね。こう打ってみて。
watch ls -l
ライニー先輩: すると画面の一番上にこんな見出しが出るはずだよ。
Every 2.0s: ls -l                 host: Fri Jun  5 19:30:00 2026
リナ: 「Every 2.0s」って、2 秒ごとって意味ですね。その下にいつもの ls -l の結果が出てます!
ライニー先輩: そう。2 秒たつたびに中身が最新の状態に更新される。ファイルが追加されたり、サイズが変わったりすると、その場で反映されるんだ。

画面上部の見出しは「実行間隔・実行中のコマンド・ホスト名・現在時刻」を表す。コマンドが今も生きて動いていることの確認にもなる。

3. 実行間隔を変えるには?(-n オプション)

結論: -n 秒数(または --interval)で間隔を指定する。例 watch -n 5 コマンド は 5 秒ごと。最小は 0.1 秒。

リナ: 2 秒だとちょっと速い気がします。もっとゆっくりにできますか?
ライニー先輩: -n で秒数を指定できるよ。5 秒ごとにしたいならこう。
watch -n 5 ls -l
リナ: 逆に、もっと速く見たいときは?
ライニー先輩: 小数も使えるんだ。-n 0.5 で 0.5 秒ごと。最小は 0.1 秒まで。ただし間隔を短くしすぎると CPU に負担がかかるから、必要な速さで十分だよ。
watch -n 0.5 ls -l

-n 1 のように間隔を短くすると、その分コマンドが頻繁に実行される。重いコマンド(大きなディレクトリの集計など)を短間隔で回すと負荷が高くなるので注意。

4. 変化した部分を目立たせるには?(-d オプション)

結論: -d--differences)で前回からの変化部分がハイライトされる。-d=permanent で最初からの累積変化を保持表示する。

リナ: 出力が多いと、どこが変わったのか目で追うのが大変です…
ライニー先輩: そんなときは -d。前回の表示から変わった部分を反転表示で目立たせてくれるよ。
watch -d ls -l
リナ: 変わったところだけ光って見える!これなら見逃さないですね。
ライニー先輩: さらに -d=permanent を使うと、一度変化した箇所をずっと強調したままにできる。「いつの間にか変わっていた場所」を後から把握したいときに便利だよ。
watch -d=permanent ls -l

5. パイプやリダイレクトを使うときの注意(クォート)

結論: |> を含めたいときは全体をクォートで囲む。囲まないとシェルが先に解釈し、watch の出力にパイプがかかってしまう。

リナ: ファイルの行数が増えるのを監視したくて watch ls | wc -l と打ったら、変な動きになりました…
ライニー先輩: それ、よくある落とし穴。クォートで囲んでいないと、シェルは「watch ls の出力を wc -l に渡す」と解釈してしまうんだ。watchls | wc -l 全体を渡したいときは、こう書く。
watch 'ls | wc -l'
リナ: なるほど、クォートで囲むと ls | wc -l がまとめて watch に渡されるんですね。
ライニー先輩: そのとおり。リダイレクト > やワイルドカード * など、シェルが特別扱いする記号を含むときも同じ。迷ったら「watch に渡すコマンド全体をシングルクォートで囲む」と覚えておくといいよ。

覚え方: パイプや記号を使うなら watch 'コマンド全体'。クォートし忘れが watch のトラブルで一番多い。

6. ヘッダーを消す・色を活かす・変化で止める

結論: -t で上部見出しを消す、-c で色付き出力を再現、-g で出力が変化した瞬間に終了できる。

リナ: 上の「Every 2.0s…」の見出し、消せたりしますか?
ライニー先輩: -t--no-title)で消せるよ。出力だけをすっきり見たいときに使う。
watch -t ls -l
リナ: あと、ls --color みたいに色を付けたコマンドだと、色が消えちゃうんですけど…
ライニー先輩: -c--color)を付けると、コマンドが出力した色(ANSI カラー)をそのまま表示してくれる。
watch -c ls --color=always
ライニー先輩: もう一つ便利なのが -g--chgexit)。出力が前回と変わった瞬間に watch を終了するんだ。「何かが変化したら知りたい」というときに使える。
watch -g ls -l

主なオプションまとめ

オプション 意味
-n 秒 実行間隔を指定(既定 2 秒、最小 0.1 秒)
-d 前回からの変化をハイライト
-d=permanent 最初からの累積変化を保持表示
-t 上部の見出しを消す
-c コマンドの色(ANSI)を再現
-g 出力が変化したら終了
-x sh -c を経由せず直接実行(引数の解釈に注意)

7. watch を終了するには?

結論: watch は止めるまで動き続ける。Ctrl + C を押すと監視を終了して通常のプロンプトに戻る。

リナ: 動かしっぱなしですけど、これどうやって止めるんですか?
ライニー先輩: Ctrl + C(コントロールキーを押しながら C)だよ。これで watch が終了して、いつものプロンプトに戻る。
リナ: あ、戻れました!ずっと動いてるから不安だったんです。
ライニー先輩: watch は自分で止めるまで延々と繰り返すからね。確認が終わったら Ctrl + C で止める、と覚えておけば大丈夫。

8. よくある使いどころ

結論: ディスク容量・プロセス・ログ件数・ネットワーク接続など「時間とともに変わる数字」を目で追いたい場面で活躍する。

リナ: 実際にはどんな場面で使うんですか?
ライニー先輩: 「変化を見張りたい」場面ならどこでも。よく使う例を挙げるね。
# ディスク使用量の変化を監視
watch df -h

# 特定プロセスの数を監視(パイプはクォート)
watch 'ps aux | grep nginx'

# ログの行数が増えていくのを監視
watch 'wc -l /var/log/syslog'

# ネットワーク接続数の変化を 5 秒ごとに監視
watch -n 5 'ss -tan | wc -l'
リナ: なるほど、「数字が変わっていくのを見たい」ときの定番なんですね。
ライニー先輩: そう。ただし、ログを流れるように追いたいだけなら tail -f のほうが向いている。watch は「画面全体を定期的に撮り直す」、tail -f は「新しい行が出るたびに下に流す」。目的で使い分けよう。

次に読む