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


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

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


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

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

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

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

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

watch がインストールされていない場合は、procps-ng パッケージに含まれています。

# RHEL/CentOS/AlmaLinux # yum install procps-ng # Ubuntu/Debian # apt install procps

基本的な使い方

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

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

# ディスク使用量を2秒おきに監視する $ watch df -h

画面上部に「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

ディスク容量がじわじわ減っていく状況や、メモリの使用量が増加傾向にあるかどうかを、ハイライト表示で素早く把握できます。

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/'


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

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

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

※登録30秒/合わなければ解除3秒


宮崎 智広

この記事を書いた人

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

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

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

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る