「dfやfreeの結果を一定間隔で自動表示させたいが、やり方がわからない」
Linuxサーバーの運用では、ディスク容量やメモリ使用量、プロセスの状態など、刻々と変化する情報を繰り返し確認する場面が数多くあります。そのたびに手動でコマンドを打ち直していては、肝心の変化を見逃しかねません。
この記事では、
watch コマンドの基本的な使い方から、実行間隔の変更、差分ハイライト、実務でよく使う組み合わせ例(Docker・systemctl・ss含む)、そしてトラブルシュートまでを解説します。while ループとの使い分けにも触れているので、用途に応じて最適な方法を選べるようになるはずです。RHEL 9 / Ubuntu 24.04 LTS で動作確認済みです。この記事のポイント
・watch コマンドは任意のコマンドをデフォルト2秒間隔で定期実行して結果を表示し続ける
・-n で間隔変更、-d で差分ハイライト、-g で変化検知終了、-e でエラー時終了に設定できる
・パイプを含むコマンドはシングルクォートで囲んで watch に渡す
・画面での目視監視は watch、ログ記録や条件分岐が必要な場合は while ループを使う
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
watchとは?コマンドを定期実行するツール
watch は、指定したコマンドを一定間隔(デフォルト2秒)で繰り返し実行し、その結果を画面に表示し続けるコマンドです。画面は毎回クリアされて最新の結果に置き換わるため、リアルタイムなモニタリングに最適です。たとえば、大きなファイルをコピーしている最中に「ディスクがどれだけ埋まったか」を確認したい場合、通常は
df -h を何度も打ち直す必要があります。watch df -h と一度打つだけで、2秒ごとに自動で実行して最新の結果を同じ画面に上書き表示し続けてくれます。| 方法 | 操作 | 向いている場面 |
|---|---|---|
| 手動で繰り返す | 同じコマンドを何度も入力する | 1回だけ確認したいとき |
| watch を使う | watch COMMAND を1回入力するだけ | 継続的に変化を追いたいとき |
top や htop のような専用モニタリングツールとは異なり、watch は 任意の コマンドをそのまま定期実行できるのが強みです。df、free、ls、ps、docker ps、systemctl status など、普段使い慣れたコマンドをそのまま監視対象にできるため、「このコマンドの結果をリアルタイムで見続けたい」というニーズに直接応えられます。# 基本書式 # 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
2. 実行間隔を変更する(-n)
-n オプションで実行間隔を秒単位で指定できます。# 5秒間隔でメモリ使用量を監視する $ watch -n 5 free -h # 1秒間隔でプロセスを監視する $ watch -n 1 'ps aux | head -10' # 0.5秒間隔で監視する(小数点も指定可能・最小は0.1秒) $ watch -n 0.5 date
より正確な間隔を維持したい場合は
--precise(または -p)オプションが有効です。通常の -n はコマンドの実行時間を無視して「実行完了後に n 秒待つ」動作をしますが、--precise を付けると実行時間を差し引いて間隔を保つよう調整します。コマンド自体に0.3秒かかる場合、watch -n 1 --precise なら次の実行までの待ちを 0.7 秒にして合計1秒を保ちます。3. 差分をハイライトする(-d)
-d(differences)オプションを付けると、前回の出力から変化した部分が反転表示されます。数値の変動を目視で追いたいときに重宝します。# 差分をハイライトしてディスク使用量を監視する $ watch -d df -h # メモリの変化をハイライト表示する $ watch -d free -m # 間隔と差分ハイライトを組み合わせる $ watch -d -n 3 df -h
なお、
-d=cumulative を指定すると、直前との差分だけでなく「監視開始以降に一度でも変化した箇所すべて」を累積ハイライトし続けます。「起動後どこが変わったかを常に把握したい」場面で使います。4. ヘッダーを非表示にする(-t)
画面上部の「Every 2.0s:~」というヘッダー行が不要な場合は、-t で非表示にできます。# ヘッダーなしで表示する $ watch -t df -h # 複数オプションを組み合わせる(5秒・ハイライト・ヘッダーなし) $ watch -n 5 -d -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' # Nginxプロセスの状態を監視する $ watch 'ps aux | grep -v grep | grep nginx' # Dockerコンテナの状態を監視する(docker が使える環境) $ watch -n 5 "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" # systemctl でサービスの状態を監視する(最初の5行だけ表示) $ watch -n 5 'systemctl status nginx | head -5'
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. コマンドが失敗したら自動停止する(-e)
-e(errexit)オプションを使うと、コマンドが非ゼロの終了コードを返した時点で watch が自動的に停止します。# PIDファイルが消えたら(プロセス停止を検知して)直ちに終了する $ watch -e 'ls /var/run/httpd/httpd.pid' # 停止検知後にアラートを出す $ watch -e 'ls /var/run/httpd/httpd.pid' || echo "httpdが停止しました" # pgrep でプロセスが消えたら終了する $ watch -e 'pgrep nginx'
-g(出力の変化で終了)と似ていますが、-e は「コマンドの失敗(終了コード非ゼロ)」そのもので終了します。pgrep はプロセスが存在しない場合に終了コード1を返すため、-e との組み合わせで「プロセスが停止した瞬間に watch を終了する」という用途に向いています。9. ANSI色付きの出力を正しく表示する(-c)
監視対象のコマンドがカラー出力を含む場合、デフォルトではエスケープシーケンスがそのまま表示されて読みにくくなります。-c オプションでANSIカラーを解釈させます。# カラー出力を正しく表示する $ watch -c 'ls --color=always /var/log/' # エラーログをカラー強調して監視する $ watch -c 'grep --color=always ERROR /var/log/app.log | tail -20'
10. 実務でよく使う組み合わせ
現場のエンジニアが日常的に使う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' # ネットワーク接続の統計情報をまとめて確認する $ watch -n 5 -d 'ss -s' # 上位プロセスを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 # システム負荷を0.5秒間隔で高頻度監視する(瞬間的なスパイク検知に) $ watch -n 0.5 'cat /proc/loadavg' # Dockerコンテナの状態を5秒ごとに確認する $ watch -n 5 "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" # systemctl でサービスの状態を継続監視する $ watch -n 5 'systemctl status nginx | head -5'
watch -d df -h を実行しておくと、どのパーティションが圧迫されているかが一目でわかります。メモリリーク調査では
free -h の used 列だけでなく available 列(OSがアプリケーションに実際に割り当てられる実質的な空きメモリ)が右肩下がりに減り続けていれば、特定プロセスの詳細調査に移るサインです。Docker環境では
watch -n 5 "docker ps" を起動したまま別ターミナルでコンテナを立ち上げると、「STATUS」列が starting から Up に切り替わる瞬間を目視で確認できます。systemctl status nginx | head -5 の組み合わせも同様で、デーモン再起動直後に active (running) が表示されるまでの時間を監視するのに便利です。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秒が目安です。Ctrl+C で終了できなくなった
リモートSSH接続中に接続が不安定だと Ctrl+C が効かない場合があります。その場合は別のターミナルからkill コマンドで終了します。# watchのプロセスIDを調べる $ ps aux | grep watch | grep -v grep # プロセスを終了する(PIDは上記コマンドの結果に合わせる) $ kill 12345
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| コマンドを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 'pgrep nginx' |
| 0.5秒間隔で高頻度監視する | watch -n 0.5 'cat /proc/loadavg' |
| Dockerコンテナの状態を監視する | watch -n 5 "docker ps" |
| サービスの起動状態を監視する | watch -n 5 'systemctl status nginx | head -5' |
| ネットワーク接続の統計を確認する | watch -n 5 -d 'ss -s' |
watchコマンドが使えると、次は「何を監視すべきか」という問いが生まれます
どのコマンドを監視すべきか判断するには、サーバー全体の設計を知る必要があります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:compress / uncompressコマンドでファイルを圧縮・解凍する方法|gzipとの違いやインストール手順も
- 前のページへ:curlコマンドでHTTP通信を行う方法|GET・POSTやヘッダー確認も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます