【Linux】watchでコマンドを定期実行して監視する方法|-nで間隔・-dで差分・パイプの罠

【Linux】watchでコマンドを定期実行して監視する方法|-nで間隔・-dで差分・パイプの罠 Linux

watchは、指定したコマンドを一定間隔で自動的に再実行し、その結果を全画面で更新し続けるコマンドです。「ファイルが増えていく様子を見守る」「ダウンロードの進み具合を追う」「プロセスやメモリの変化を監視する」——こうした「同じコマンドを何度も打って変化を確かめる」作業を自動化してくれます。既定では2秒ごとにコマンドを実行し、画面を書き換えます。

topのような専用の監視ツールと違い、watchどんなコマンドでも「監視モード」にできるのが強みです。lsでもdfでもssでも、後ろに付けるだけでリアルタイム監視になります。この記事では、実機のLinux(WSLのDebian)で実際にファイル数が増えていく様子を監視しながら、watchの使い方と、パイプの扱いなどのつまずきポイントを整理します。

先に結論

  • watch コマンドで、そのコマンドを2秒ごとに再実行して監視します(qで終了)。
  • 間隔は-n 秒-n 1で1秒、-n 0.5で0.5秒)で変えられます。
  • -dで前回との差分(変化した部分)をハイライトできます。
  • -tで上部のヘッダー(Every 2.0s...)を消せます。
  • 【罠】パイプ|を使うときはコマンド全体をクォートで囲みます。
  • 【罠】aliasやシェル関数はwatchでそのまま使えません

リアルタイム監視の専用ツールはtop、ログの追従はtail -f、ポートの確認はssもあわせて参考になります。

スポンサーリンク

watchの基本:2秒ごとに再実行

watch コマンドと書くと、そのコマンドが2秒ごとに実行され、画面が更新されます。画面上部には「何秒ごとに」「何のコマンドを」「現在時刻」が表示されます。終了はqまたはCtrl+Cです。

watch の基本
# ls の結果を2秒ごとに更新(ファイルの増減を監視)
watch ls

# 画面上部にこう表示される:
# Every 2.0s: ls    HOSTNAME: Fri Jul 24 04:22:35 2026
#   ↑間隔        ↑コマンド      ↑現在時刻

# 下にコマンドの実行結果が表示され、2秒ごとに書き換わる

# 終了は q キー(または Ctrl+C)

実機で、ファイルを次々に作成しながらwatch 'ls | wc -l'(ファイル数を数える)を実行したところ、表示される数字が135と、実行のたびに増えていく様子を確認できました。watch「同じコマンドを繰り返し打つ」作業を肩代わりしてくれるので、変化を目で追いたいときに非常に便利です。画面上部のEvery 2.0s: ...というヘッダーで、間隔とコマンド、現在時刻が常に確認できます。

間隔を変える(-n)

既定の2秒間隔は-n 秒で変更できます。もっと速く見たいなら-n 1(1秒)や-n 0.5(0.5秒)、負荷を減らしたいなら長めに設定します。

-n で間隔を指定
# 1秒ごとに更新
watch -n 1 'date +%S'
#   ↑ 秒数が 38 → 39 → 40 と毎秒更新される

# 0.5秒ごと(より細かく)
watch -n 0.5 'ss -tln'

# 5秒ごと(負荷を抑えて長時間監視)
watch -n 5 'df -h'

実機でも、watch -n 1 'date +%S'を実行すると表示される秒数が1秒ごとに更新(38→39)されることを確認しました。間隔が短いほどリアルタイム性は上がりますが、そのぶんコマンドが頻繁に実行されるため、重いコマンド(findなど広範囲を探すもの)を短い間隔で監視するのは避けましょう。監視対象の変化の速さに合わせて、適切な間隔を選ぶのがコツです。

【便利】-dで変化した部分をハイライト

watchで特に便利なのが-d(differences)です。前回の実行結果と比べて「変化した部分」を反転表示(ハイライト)してくれるため、大量の出力の中で「どこが変わったか」が一目で分かります

-d で差分をハイライト
# 変化した箇所がハイライトされる
watch -d 'ls -l'
#   ↑ ファイルサイズや更新時刻が変わった行が反転表示される

# ネットワーク接続の変化を監視
watch -d 'ss -tn state established'
#   ↑ 新しい接続・消えた接続が一目で分かる

# メモリ使用量の変化を追う
watch -d 'free -h'
#   ↑ 数値が変わった部分が光る

-dオプションは実機でも利用可能で、「前回と今回で変化した文字」だけをハイライトする機能です。たとえばwatch -d 'free -h'メモリを監視すれば、数値が動いた部分だけが光るので、変化を見逃しません。大量の情報が並ぶ出力(ssの接続一覧やls -lのファイル一覧など)で、「何がどう変わったか」を素早く把握したいときに絶大な効果を発揮します。さらに-d=permanent-dに値を付ける)とすると、一度変化した箇所をずっとハイライトし続けることもできます。

【最重要の罠】パイプはクォートで囲む

watchで最もよくある失敗がパイプ|の扱いです。watch ls | grep txtと書くと、grepwatchの出力に適用されてしまい、意図した動作になりませんコマンド全体をwatchに渡すには、クォートで囲む必要があります。

パイプはクォート必須
# NG: grep が watch 自体の出力に適用されてしまう
watch ls | grep txt
#   ↑ これは「watch ls の出力」を grep する意味になり、監視にならない

# OK: コマンド全体をクォートで囲んで watch に渡す
watch 'ls | grep txt'
#   ↑ 「ls | grep txt」というコマンドを2秒ごとに実行

# リダイレクトも同様
watch 'ps aux | grep nginx'    # OK
watch 'du -sh * | sort -rh'    # OK
パイプ・リダイレクトは必ずクォートで囲む(重要)

watch ls | grep txtのようにクォートなしでパイプを書くと、シェルはこれを「watch lsの出力をgrep txtに渡す」と解釈します。つまりgrepwatchの全画面出力に適用され、監視したい「ls | grep txt」というコマンドにはなりません。正しくはwatch 'ls | grep txt'のように、監視したいコマンド全体をシングルクォートで囲んでwatchの引数として渡します。これはパイプ>リダイレクト、複数コマンドをつなぐ;&&を使うとき、すべてに共通するルールです。watch 'du -sh * | sort -rh'(容量の大きい順に監視)、watch 'ps aux | grep プロセス名'(特定プロセスの監視)のように、複雑なコマンドほどクォートが必須になります。「watchで思った結果にならない」ときは、まずこのクォートを疑ってください。

【罠】aliasや関数はそのまま使えない

もう一つの落とし穴です。watchは内部で新しいシェル(sh -c)を起動してコマンドを実行するため、あなたが設定したaliasやシェル関数は使えません

aliasは使えない
# alias ll='ls -la' を設定していても…
watch ll
#   ↑ watch: ll: No such file or directory(aliasは無効)

# 対処1: alias の中身を直接書く
watch 'ls -la'

# 対処2: -x で exec に渡す(関数などの特殊なケース)
watch -x bash -c 'my_function'

実機で確認したところ、watchには-x(exec)というオプションがあり、これはsh -cではなく直接コマンドを実行する指定です。watchaliasシェル関数を認識しないのは、あなたの対話シェルとは別の新しいシェルでコマンドを動かすためで、これはaliasがスクリプトで効かないのと同じ理由です。対処は簡単で、aliasの中身(実際のコマンド)を直接書くのが最も確実です。「普段使っているaliasがwatchで動かない」ときは、その正体をtypeで調べて、展開後のコマンドをwatchに渡してください。

主なオプション一覧

watchでよく使うオプションをまとめます。

オプション 働き
watch コマンド 2秒ごとに再実行して監視
-n 秒 実行間隔を指定(0.5秒なども可)
-d 前回との差分をハイライト
-t 上部のヘッダーを消す
-g 出力が変化したら終了
'コマンド | ...' パイプはクォートで囲む

よくある失敗

パイプが効かず監視にならない

コマンド全体をクォートで囲みます(watch 'ls | grep x')。

aliasを指定して「No such file or directory」

watchはaliasを認識しません。中身を直接書きます。

watchから抜けられない

qまたはCtrl+Cで終了します。

重いコマンドを短い間隔で監視して負荷をかける

監視対象の変化の速さに合わせ、-nで適切な間隔にします。

tail -fの代わりにwatch tailを使う

ログの追従はtail -fが適しています。watchは全体を毎回再表示する用途です。

よくある質問

Qwatchは何に使うコマンドですか?
A指定したコマンドを一定間隔(既定2秒)で自動的に再実行し、結果を全画面で更新し続けるコマンドです。ファイル数の増減、メモリ使用量ネットワーク接続の変化など、「同じコマンドを何度も打って変化を確かめる」作業を自動化できます。実機でも、ファイルが増えるたびに表示数が更新されることを確認しています。終了はqです。
Qwatchで実行間隔を変えるには?
A-n 秒で指定します。watch -n 1 コマンドで1秒ごと、-n 0.5で0.5秒ごとです。既定は2秒です。間隔を短くするとリアルタイム性は上がりますが、コマンドが頻繁に実行されるため、重いコマンドを短い間隔で監視するのは避けてください。
Qwatchでパイプ(|)を使うと動きません。
Aクォートで囲む必要があります。watch ls | grep txtと書くと、grepがwatch自体の出力に適用されてしまいます。正しくはwatch 'ls | grep txt'のように、監視したいコマンド全体をシングルクォートで囲んでwatchに渡してください。リダイレクトや複数コマンドの連結も同様です。
Q変化した部分だけを目立たせられますか?
A-dオプションを使います。watch -d コマンドとすると、前回の実行結果と比べて変化した部分が反転表示(ハイライト)されます。大量の出力の中で「どこが変わったか」を素早く把握したいときに便利です。watch -d 'free -h'でメモリの変化を追うといった使い方ができます。
Q自分で設定したaliasがwatchで使えません。
Awatchは内部で新しいシェルを起動してコマンドを実行するため、対話シェルで設定したaliasやシェル関数は認識されません。これはaliasがスクリプトで効かないのと同じ理由です。対処は、aliasの中身(実際のコマンド)を直接watchに渡すことです。中身はtype コマンド名で確認できます。

まとめ

  • watch コマンド2秒ごとに再実行して監視(qで終了)。
  • 間隔は-n 秒差分ハイライトは-d、ヘッダー消しは-t
  • パイプ・リダイレクトはコマンド全体をクォートで囲みます。
  • aliasや関数はwatchで使えないので中身を直接書きます。
  • ログの追従はtail -f、専用監視はtopと使い分けます。

watchは、どんなコマンドでも「監視モード」に変えられる汎用ツールです。「パイプはクォート」「差分は-d」——この2点さえ押さえれば、ssfreedfなど様々なコマンドと組み合わせて、システムの変化をリアルタイムに見張れるようになります。

シリーズで学ぶLinuxコマンド基礎