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です。
# ls の結果を2秒ごとに更新(ファイルの増減を監視) watch ls # 画面上部にこう表示される: # Every 2.0s: ls HOSTNAME: Fri Jul 24 04:22:35 2026 # ↑間隔 ↑コマンド ↑現在時刻 # 下にコマンドの実行結果が表示され、2秒ごとに書き換わる # 終了は q キー(または Ctrl+C)
実機で、ファイルを次々に作成しながらwatch 'ls | wc -l'(ファイル数を数える)を実行したところ、表示される数字が1→3→5と、実行のたびに増えていく様子を確認できました。watchは「同じコマンドを繰り返し打つ」作業を肩代わりしてくれるので、変化を目で追いたいときに非常に便利です。画面上部のEvery 2.0s: ...というヘッダーで、間隔とコマンド、現在時刻が常に確認できます。
間隔を変える(-n)
既定の2秒間隔は-n 秒で変更できます。もっと速く見たいなら-n 1(1秒)や-n 0.5(0.5秒)、負荷を減らしたいなら長めに設定します。
# 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)です。前回の実行結果と比べて「変化した部分」を反転表示(ハイライト)してくれるため、大量の出力の中で「どこが変わったか」が一目で分かります。
# 変化した箇所がハイライトされる 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と書くと、grepはwatchの出力に適用されてしまい、意図した動作になりません。コマンド全体を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に渡す」と解釈します。つまりgrepがwatchの全画面出力に適用され、監視したい「ls | grep txt」というコマンドにはなりません。正しくはwatch 'ls | grep txt'のように、監視したいコマンド全体をシングルクォートで囲んでwatchの引数として渡します。これはパイプや>リダイレクト、複数コマンドをつなぐ;や&&を使うとき、すべてに共通するルールです。watch 'du -sh * | sort -rh'(容量の大きい順に監視)、watch 'ps aux | grep プロセス名'(特定プロセスの監視)のように、複雑なコマンドほどクォートが必須になります。「watchで思った結果にならない」ときは、まずこのクォートを疑ってください。
【罠】aliasや関数はそのまま使えない
もう一つの落とし穴です。watchは内部で新しいシェル(sh -c)を起動してコマンドを実行するため、あなたが設定した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ではなく直接コマンドを実行する指定です。watchがaliasやシェル関数を認識しないのは、あなたの対話シェルとは別の新しいシェルでコマンドを動かすためで、これは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は全体を毎回再表示する用途です。
よくある質問
-n 秒で指定します。watch -n 1 コマンドで1秒ごと、-n 0.5で0.5秒ごとです。既定は2秒です。間隔を短くするとリアルタイム性は上がりますが、コマンドが頻繁に実行されるため、重いコマンドを短い間隔で監視するのは避けてください。watch ls | grep txtと書くと、grepがwatch自体の出力に適用されてしまいます。正しくはwatch 'ls | grep txt'のように、監視したいコマンド全体をシングルクォートで囲んでwatchに渡してください。リダイレクトや複数コマンドの連結も同様です。-dオプションを使います。watch -d コマンドとすると、前回の実行結果と比べて変化した部分が反転表示(ハイライト)されます。大量の出力の中で「どこが変わったか」を素早く把握したいときに便利です。watch -d 'free -h'でメモリの変化を追うといった使い方ができます。type コマンド名で確認できます。まとめ
watch コマンドで2秒ごとに再実行して監視(qで終了)。- 間隔は
-n 秒、差分ハイライトは-d、ヘッダー消しは-t。 - パイプ・リダイレクトはコマンド全体をクォートで囲みます。
- aliasや関数はwatchで使えないので中身を直接書きます。
- ログの追従はtail -f、専用監視はtopと使い分けます。
watchは、どんなコマンドでも「監視モード」に変えられる汎用ツールです。「パイプはクォート」「差分は-d」——この2点さえ押さえれば、ssやfree、dfなど様々なコマンドと組み合わせて、システムの変化をリアルタイムに見張れるようになります。
- grep(文字列検索)
- find(ファイル検索)
- sed(置換・行編集)
- awk(列抽出・集計)
- cut(列の切り出し)
- chmod(パーミッション)
- tar(圧縮・解凍)
- gzip・gunzip(ファイル圧縮)
- リダイレクトとパイプ
- echo・printf(文字列出力)
- ps・kill(プロセス管理)
- free・uptime(メモリ/負荷)
- top(リアルタイム監視)
- watch(定期実行監視)
- 環境変数とPATH
- which・type(コマンドの正体)
- ln(シンボリックリンク)
- cp・mv・rm(コピー/移動/削除)
- touch・mkdir(ファイル/フォルダ作成)
- basename・dirname(パス分解)
- history(コマンド履歴)
- curl(HTTP通信・API)
- wget(ダウンロード)
- ping(疎通確認)
- dig・nslookup(DNS調査)
- ss・netstat(ポート確認)
- jq(JSON処理)
- vim(基本操作・終了方法)
- cron・crontab(定期実行)
- test・[ ](条件判定)
- read(入力の読み取り)
- date(日付・時刻)
- sort・uniq・wc(並べ替え/集計)
- xargs(一括処理)
- chown・chgrp(所有者/グループ変更)
- sudo(管理者権限)
- diff(ファイル比較)
- du・df(ディスク使用量)
- head・tail(先頭/末尾・ログ監視)
- cat・less(ファイル表示)
- alias(コマンドの別名)
- nohup(SSH切断対策)
- tmux(セッション管理)
- よく使うコマンドまとめ
- cd(ディレクトリ移動)
