watchコマンドで定期的にコマンドを繰り返し実行する方法|変化の検出やログ監視にも

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > watchコマンドで定期的にコマンドを繰り返し実行する方法|変化の検出やログ監視にも
「サーバーの負荷状況を数秒おきに確認したいけど、毎回手動でコマンドを打つのが面倒だ」
「dfやfreeの結果を一定間隔で自動表示させたいが、やり方がわからない」
Linuxサーバーの運用では、ディスク容量やメモリ使用量、プロセスの状態など、刻々と変化する情報を繰り返し確認する場面が数多くあります。そのたびに手動でコマンドを打ち直していては、肝心の変化を見逃しかねません。

この記事では、watch コマンドの基本的な使い方から、実行間隔の変更、差分ハイライト、実務でよく使う組み合わせ例、そしてトラブルシュートまでを解説します。while ループとの使い分けにも触れているので、用途に応じて最適な方法を選べるようになるはずです。RHEL 9 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・watch コマンドは任意のコマンドをデフォルト2秒間隔で定期実行して結果を表示し続ける
・-n で間隔変更、-d で差分ハイライト、-g で変化検知終了に設定できる
・パイプを含むコマンドはシングルクォートで囲んで watch に渡す
・画面での目視監視は watch、ログ記録や条件分岐が必要な場合は while ループを使う


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

watchとは?コマンドを定期実行するツール

watch は、指定したコマンドを一定間隔(デフォルト2秒)で繰り返し実行し、その結果を画面に表示し続けるコマンドです。画面は毎回クリアされて最新の結果に置き換わるため、リアルタイムなモニタリングに最適です。

top のようにインタラクティブなツールとは異なり、watch は任意のコマンドをそのまま定期実行できるのが強みです。dffreelsps など、普段使い慣れたコマンドをそのまま監視対象にできます。

# 基本書式 # watch [オプション] コマンド

watch コマンドは多くの Linux ディストリビューションで procps-ng(RHEL 系)または procps(Debian/Ubuntu 系)パッケージに含まれており、最小インストールを除けば通常は追加インストール不要です。

# インストール確認(RHEL 9 / AlmaLinux 9 / Rocky Linux 9) $ rpm -q procps-ng procps-ng-3.3.17-14.el9.x86_64 # インストール確認(Ubuntu 24.04 LTS) $ dpkg -l procps | grep ^ii ii procps 2:4.0.4-4ubuntu3 amd64 /proc file system utilities

基本的な使い方

1. コマンドを2秒間隔で繰り返す

最もシンプルな使い方は、watch の後ろにコマンドを書くだけです。デフォルトで2秒ごとにコマンドが実行されます。

# ディスク使用量を2秒おきに監視する $ watch df -h # 実行後の画面表示例 Every 2.0s: df -h server01: Sat Jun 7 10:00:00 2026 Filesystem Size Used Avail Use% Mounted on devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 7.7G 0 7.7G 0% /dev/shm tmpfs 3.1G 8.8M 3.1G 1% /run /dev/sda3 98G 24G 74G 25% / /dev/sda1 960M 300M 661M 32% /boot

画面上部の「Every 2.0s: df -h」には実行間隔・コマンド名・ホスト名・現在時刻が表示されます。何を監視しているかが一目でわかる仕組みです。Ctrl+C で終了します。

2. 実行間隔を変更する(-n)

-n オプションで実行間隔を秒単位で指定できます。

# 5秒間隔でメモリ使用量を監視する $ watch -n 5 free -h # 1秒間隔でプロセスを監視する $ watch -n 1 'ps aux | head -10' # 0.5秒間隔で監視する(小数点も指定可能) $ watch -n 0.5 date

負荷の高いコマンドを短い間隔で実行するとサーバーに負担がかかります。本番環境では5秒~10秒程度にしておくのが無難です。

3. 差分をハイライトする(-d)

-d(differences)オプションを付けると、前回の出力から変化した部分が反転表示されます。数値の変動を目視で追いたいときに重宝します。

# 差分をハイライトしてディスク使用量を監視する $ watch -d df -h # メモリの変化をハイライト表示する $ watch -d free -m # 間隔と差分ハイライトを組み合わせる $ watch -d -n 3 df -h

ディスク容量がじわじわ減っていく状況や、バッチ処理中にメモリ使用量が増加傾向にあるかどうかを、ハイライト表示で素早く把握できます。ハイライトは2回目以降の実行から有効になります(最初の表示では比較対象がないため正常動作です)。

4. ヘッダーを非表示にする(-t)

画面上部の「Every 2.0s:~」というヘッダー行が不要な場合は、-t で非表示にできます。

# ヘッダーなしで表示する $ watch -t df -h

画面をすっきりさせたいときや、出力結果だけに集中したいときに使います。

パイプやクォートを使うコマンドの書き方

5. パイプを含むコマンドを実行する

watch に渡すコマンドにパイプ(|)やリダイレクトが含まれる場合は、コマンド全体をシングルクォートで囲みます。

# 特定プロセスの状態を監視する $ watch 'ps aux | grep httpd | grep -v grep' # 接続数をカウントする $ watch 'ss -tn state established | wc -l' # ログファイルの末尾を表示する $ watch 'tail -5 /var/log/messages' # メールキューのファイル数を監視する $ watch 'ls /var/spool/postfix/deferred | wc -l' # システムログの直近20行を5秒ごとに確認する $ watch -n 5 'journalctl -n 20 --no-pager'

クォートで囲まないと、パイプの後ろの部分が watch ではなくシェルに解釈されてしまい、意図通りに動きません。パイプを使う場合は必ずクォートで囲んでください。

6. 変数展開を使いたい場合

シングルクォートだとシェル変数が展開されません。変数を使いたい場合はダブルクォートを使います。

# NG:シングルクォートでは変数が展開されない $ LOGFILE=/var/log/nginx/access.log $ watch 'tail -10 $LOGFILE' # $LOGFILEがそのまま文字列になる # OK:ダブルクォートで変数展開させる $ TARGET="/var/log/messages" $ watch "tail -5 $TARGET"

ただし、ダブルクォート内で特殊文字(!$ など)を使う場合はエスケープが必要になるため、パイプだけならシングルクォート、変数展開が必要ならダブルクォートと使い分けてください。

応用・実務Tips

7. コマンドの終了コードが変わったら停止する(-g)

-g(chg-exit)オプションを使うと、コマンドの出力内容が変化した時点で watch が自動的に終了します。

# 出力が変化したら終了する $ watch -g 'ls /tmp/target_dir | wc -l' # 特定ファイルが作成されたら終了する $ watch -g 'ls /var/run/app.pid 2>/dev/null' # 変化検知後に後続コマンドを実行する $ watch -g 'ls /tmp/done.flag 2>/dev/null' && echo "処理完了"

「特定のファイルが作成されるまで待つ」「プロセス数が変わるまで監視する」といった場面で活用できます。バッチ処理の完了待ちを while true; do sleep 5; done で書くより、watch -g の方がすっきり書けます。

8. ANSI色付きの出力を正しく表示する(-c)

監視対象のコマンドがカラー出力を含む場合、デフォルトではエスケープシーケンスがそのまま表示されて読みにくくなります。-c オプションでANSIカラーを解釈させます。

# カラー出力を正しく表示する $ watch -c 'ls --color=always /var/log/' # エラーログをカラー強調して監視する $ watch -c 'grep --color=always ERROR /var/log/app.log | tail -20'

9. 実務でよく使う組み合わせ

現場のエンジニアが日常的に使う watch の組み合わせを紹介します。

# ディスク容量の変化を監視する(ログ肥大化の検知に) $ watch -d -n 10 df -h # 特定ディレクトリのサイズ推移を追跡する(rsync実行中など) $ watch -n 5 -d 'du -sh /var/backup/' # メモリ使用量を1秒ごとに監視する(メモリリーク調査に) $ watch -n 1 free -h # TCP接続数を監視する(DDoS対策の初動に) $ watch -n 2 'ss -tn state established | wc -l' # 80番ポートへの接続数に絞って監視する $ watch 'ss -nt state established dport = :80 | wc -l' # 上位プロセスをCPU使用率順に表示する $ watch -n 2 'ps aux --sort=-%cpu | head -11' # アクセスログの末尾を3秒ごとに確認する $ watch -n 3 'tail -20 /var/log/nginx/access.log' # 特定ディレクトリのファイル数を監視する(メールキューなど) $ watch 'ls /var/spool/postfix/active/ | wc -l' # ユーザーのログイン状況を監視する $ watch -d who

特にディスク容量の監視は、ログファイルが急激に肥大化するような障害時に watch -d df -h を実行しておくと、どのパーティションが圧迫されているかが一目でわかります。メモリリーク調査では used の数値が右肩上がりに増え続けていれば、特定プロセスの詳細調査に移るサインです。

whileループとの使い分け

watch と似た機能を while ループでも実現できます。どちらを使うべきかの判断基準を整理します。

項目 watch whileループ
用途 画面での対話的な監視 スクリプトでの自動処理
画面クリア 自動(全画面置換) 手動でclearが必要
差分表示 -dで標準搭載 自前実装が必要
結果の記録 画面表示のみ ファイルに記録可能
条件分岐 -gで終了のみ if文で自由に制御
結論として、ターミナルで目視監視するなら watch、結果をログに残したい・条件に応じて処理を分岐したいなら while ループが適しています。

while ループの例はこちらです。

# 5秒おきにディスク使用率を記録する(whileループ版) $ while true; do df -h / | tail -1 >> /tmp/disk_log.txt; sleep 5; done

「watch: command not found」が出た時の対処法

最小インストールの環境では watch が入っていないことがあります。procps-ng(RHEL系)または procps(Debian系)をインストールしてください。

# RHEL 9 / AlmaLinux 9 / Rocky Linux 9 $ sudo dnf install procps-ng # CentOS 7 / RHEL 7 $ sudo yum install procps-ng # Ubuntu/Debian $ sudo apt install procps # インストール後の確認 $ which watch /usr/bin/watch $ watch --version watch from procps-ng 3.3.17

また、watch で実行するコマンド自体が見つからない場合は、watch がサブシェルで実行していることが原因の可能性があります。コマンドのフルパスを指定するか、which でパスを確認してください。

# コマンドのフルパスを確認する $ which free /usr/bin/free # フルパスで指定する $ watch /usr/bin/free -h

トラブルシュート・よくある失敗パターン

パイプが機能しない(想定外の結果が出る)

パイプを含む場合はシングルクォートが必要です。まず単独でコマンドを実行して動作確認してから watch に渡す習慣をつけると、デバッグが楽になります。

# まず単独で動作確認する $ ps aux | grep nginx | grep -v grep # 問題なければ watch に渡す $ watch 'ps aux | grep nginx | grep -v grep'

シェル変数が展開されない

シングルクォートで囲むと、シェル変数は展開されません。変数を使いたい場合はダブルクォートに切り替えてください。

# NG:$LOGFILE がそのまま文字列になる $ watch 'tail -10 $LOGFILE' # OK:ダブルクォートで変数を展開する $ LOGFILE=/var/log/nginx/access.log $ watch "tail -10 $LOGFILE"

-d オプションのハイライトが消える

-d オプションのハイライトは前回の出力と比較するため、2回目以降の実行から有効になります。最初の表示でハイライトが出ないのは正常な動作です。数秒待って変化が生じれば反転表示されます。

カラー表示が出ない(grep --color など)

カラーエスケープシーケンスを有効にするには -c オプションが必要です。-c なしだと、ANSIエスケープコードが文字列としてそのまま画面に出てしまいます。

# NG:-cなしではエスケープコードが生で表示される $ watch 'grep --color=always ERROR /var/log/app.log | tail -20' # OK:-c オプションでカラー解釈を有効にする $ watch -c 'grep --color=always ERROR /var/log/app.log | tail -20'

高頻度更新でCPU負荷が上がった

-n 0.1 のような超短間隔指定は CPU コアを大量消費することがあります。監視目的であれば -n 1 以上を推奨します。本番サーバーで使用する場合は5秒~10秒が目安です。

本記事のまとめ

やりたいこと コマンド
コマンドを2秒おきに繰り返す watch df -h
実行間隔を変更する watch -n 5 free -h
変化した箇所をハイライトする watch -d df -h
ヘッダーを非表示にする watch -t df -h
パイプを含むコマンドを実行する watch 'ps aux | grep httpd'
出力が変化したら終了する watch -g 'ls /tmp | wc -l'
ANSIカラーを正しく表示する watch -c 'ls --color=always /var/log/'
コマンド失敗時に停止する watch -e 'ls /var/run/app.pid'
0.5秒間隔で高頻度監視する watch -n 0.5 'cat /proc/loadavg'

watchコマンドが使えると、次は「何を監視すべきか」という問いが生まれます

どのコマンドを監視すべきか判断するには、サーバー全体の設計を知る必要があります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。