「dfやfreeの結果を一定間隔で自動表示させたいが、やり方がわからない」
Linuxサーバーの運用では、ディスク容量やメモリ使用量、プロセスの状態など、刻々と変化する情報を繰り返し確認する場面が数多くあります。そのたびに手動でコマンドを打ち直していては、肝心の変化を見逃しかねません。
この記事では、
watch コマンドの基本的な使い方から、実行間隔の変更、差分ハイライト、実務でよく使う組み合わせ例、そしてトラブルシュートまでを解説します。while ループとの使い分けにも触れているので、用途に応じて最適な方法を選べるようになるはずです。でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
watchとは?コマンドを定期実行するツール
watch は、指定したコマンドを一定間隔(デフォルト2秒)で繰り返し実行し、その結果を画面に表示し続けるコマンドです。画面は毎回クリアされて最新の結果に置き換わるため、リアルタイムなモニタリングに最適です。top のようにインタラクティブなツールとは異なり、watch は任意のコマンドをそのまま定期実行できるのが強みです。df、free、ls、ps など、普段使い慣れたコマンドをそのまま監視対象にできます。# 基本書式 # watch [オプション] コマンド
watch がインストールされていない場合は、procps-ng パッケージに含まれています。# RHEL/CentOS/AlmaLinux # yum install procps-ng # Ubuntu/Debian # apt install procps
基本的な使い方
1. コマンドを2秒間隔で繰り返す
最もシンプルな使い方は、watch の後ろにコマンドを書くだけです。デフォルトで2秒ごとにコマンドが実行されます。# ディスク使用量を2秒おきに監視する $ watch df -h
2. 実行間隔を変更する(-n)
-n オプションで実行間隔を秒単位で指定できます。# 5秒間隔でメモリ使用量を監視する $ watch -n 5 free -h # 1秒間隔でプロセスを監視する $ watch -n 1 'ps aux | head -10' # 0.5秒間隔で監視する(小数点も指定可能) $ watch -n 0.5 date
3. 差分をハイライトする(-d)
-d(differences)オプションを付けると、前回の出力から変化した部分が反転表示されます。数値の変動を目視で追いたいときに重宝します。# 差分をハイライトしてディスク使用量を監視する $ watch -d df -h # メモリの変化をハイライト表示する $ watch -d free -m
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 ではなくシェルに解釈されてしまい、意図通りに動きません。パイプを使う場合は必ずクォートで囲んでください。6. 変数展開を使いたい場合
シングルクォートだとシェル変数が展開されません。変数を使いたい場合はダブルクォートを使います。# 変数を展開して使う $ TARGET="/var/log/messages" $ watch "tail -5 $TARGET"
!、$ など)を使う場合はエスケープが必要になるため、パイプだけならシングルクォート、変数展開が必要ならダブルクォートと使い分けてください。応用・実務Tips
7. コマンドの終了コードが変わったら停止する(-g)
-g(chg-exit / beep on change)オプションを使うと、コマンドの出力内容が変化した時点で watch が自動的に終了します。# 出力が変化したら終了する $ watch -g 'ls /tmp/target_dir | wc -l'
8. ANSI色付きの出力を正しく表示する(-c)
監視対象のコマンドがカラー出力を含む場合、デフォルトではエスケープシーケンスがそのまま表示されて読みにくくなります。-c オプションでANSIカラーを解釈させます。# カラー出力を正しく表示する $ watch -c 'ls --color=always /var/log/'
9. 実務でよく使う組み合わせ
現場のエンジニアが日常的に使うwatch の組み合わせを紹介します。# ディスク容量の変化を監視する(ログ肥大化の検知に) $ watch -d -n 10 df -h # メモリ使用量を1秒ごとに監視する $ watch -n 1 free -h # TCP接続数を監視する(DDoS対策の初動に) $ watch -n 2 'ss -tn state established | wc -l' # 特定ディレクトリのファイル数を監視する $ watch 'ls /var/spool/postfix/active/ | wc -l' # ユーザーのログイン状況を監視する $ watch -d who
watch -d df -h を実行しておくと、どのパーティションが圧迫されているかが一目でわかります。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/CentOS/AlmaLinux $ sudo yum install procps-ng # Ubuntu/Debian $ sudo apt install procps
watch で実行するコマンド自体が見つからない場合は、watch がサブシェルで実行していることが原因の可能性があります。コマンドのフルパスを指定するか、which でパスを確認してください。# コマンドのフルパスを確認する $ which free /usr/bin/free # フルパスで指定する $ watch /usr/bin/free -h
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| コマンドを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/' |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
※登録30秒/合わなければ解除3秒
