watchコマンドの使い方完全ガイド|定期実行・差分ハイライト・オプション早見表

コマンドリファレンス

「手作業は負け」「スクリプトはシンプルに」。Bash玄(ばっしゅげん)です。

サーバーの障害調査やバッチ処理の完了待ちで、同じコマンドを何度もキーボードで叩いて画面を確認していませんか?何度も矢印キーの上を押してEnterを連打する作業は、時間と集中力を浪費するだけでなく、重要な変化を見逃す原因になります。

Linuxの watchコマンド を使えば、指定したコマンドを一定間隔で自動実行し、ターミナル上に最新の実行結果をリアルタイム表示できます。本記事では、基本構文から差分ハイライト、実務で頻出の監視テクニック、初心者が必ずつまずく「パイプのクォーティング問題」まで、現場ですぐに役立つ実践ノウハウを徹底解説します。


watchコマンドとは?定期実行と画面監視の基本

watchコマンド は、指定したLinuxコマンドをバックグラウンドまたはフォアグラウンドで定期的に繰り返し実行し、その出力をターミナル画面全体にリフレッシュ表示し続けるユーティリティです。

現場でコマンドを定期実行する際、以下のような while ループを書くエンジニアをよく見かけます。

# whileループによる簡易的な定期監視(非推奨)
while true; do free -h; sleep 2; done

しかし、実務においてこのシェルスクリプトによるループ監視はおすすめできません。画面が下方向へ延々とスクロールしてターミナルが流れてしまい、直前の状態との違いを目視で追うのが極めて難しくなるためです。

watchコマンドと while sleep ループの決定的な違いは以下の点にあります:

  1. 画面の自動クリアと定点表示: 画面をスクロールさせず、ターミナル最上部に固定してリフレッシュ表示するため、数値の変動が一目で把握できます。
  2. 強力な差分ハイライト機能: -d オプションを付けるだけで、前回実行時からの変化箇所を反転表示してくれます。
  3. 端末制御の安全性: 端末サイズ変更に自動追従し、Ctrl + C を1回押すだけでプロセスを安全かつ確実に停止できます。

面倒なループスクリプトを書く必要はありません。watchコマンドにコマンドを渡すだけで、即座に快適な監視ダッシュボードが手に入ります。


watchコマンドの基本構文と最短実行例

watchコマンドはシンプルな構文で直感的に扱えます。

基本構文のルールと引数の指定方法

# watchコマンドの基本構文
watch [オプション] "実行したいコマンド"

オプションの後に実行したいコマンドとその引数を渡します。引数にパイプやリダイレクト、複数のオプションが含まれる場合は、コマンド全体を必ずダブルクォートで囲む のが実務上の鉄則です(理由は後述の落とし穴セクションで詳しく解説します)。

最短実行例:1秒ごとのメモリ使用状況を監視

まずは最も手軽で実用的な例として、サーバーのメモリ使用量を1秒ごとに監視してみましょう。内部で freeコマンド を呼び出します。

# 1秒間隔でfreeコマンドを実行してメモリ使用状況をリアルタイム監視
watch -n 1 "free -h"

実行すると、ターミナル画面全体が切り替わり、最上部に以下のようなヘッダー情報が表示されます。

Every 1.0s: free -h                                   server01: Mon Oct 27 12:00:00

              total        used        free      shared  buff/cache   available
Mem:           15Gi       3.2Gi       8.5Gi       120Mi       3.3Gi        11Gi
Swap:         2.0Gi          0B       2.0Gi

ヘッダーの左側には実行間隔(Every 1.0s)と監視対象のコマンド名(free -h)、右側にはホスト名と現在日時が表示されます。画面を閉じたいときは Ctrl + C を押すだけで安全に終了します。


主要オプション一覧・逆引き早見表

watchコマンドは標準でも十分強力ですが、オプションを組み合わせることで障害対応やバッチ監視の効率が劇的に向上します。現場で頻出の主要オプションをまとめました。

オプション ロング名 機能概要 実務での実用例
-n <秒> --interval 実行間隔を秒単位で指定(デフォルトは2秒。0.5などの小数も可能) watch -n 0.5 "ss -s"
-d --differences 前回出力からの変更箇所を反転ハイライト表示 watch -d "ls -lh /var/log"
-d=cumulative --differences=cumulative 初回実行時からの全変更箇所を累積してハイライト保持 watch -d=cumulative "netstat -s"
-t --no-title 最上部のヘッダー行(実行間隔・コマンド名・日時)を非表示にする watch -t "cat /proc/loadavg"
-g --chgexit コマンド出力に変化があった瞬間にwatchを自動終了する watch -g "pgrep -f backup.sh"
-e --errexit 監視コマンドがエラー(終了ステータス≠0)を返した瞬間に終了 watch -e "curl -sI http://localhost"
-b --beep コマンドの終了ステータスが0以外になった時にビープ音を鳴らす watch -b "ping -c 1 192.168.1.1"
-c --color ANSIカラーエスケープシーケンスを解釈し、色付き出力を保持 watch -c "ls --color=always"

特に実行間隔を指定する -n、差分を浮き彫りにする -d、バッチ処理待ちを自動化する -g の3つは、インフラ運用で毎日のように使う必須オプションです。


実務で役立つ頻出ユースケース&コピペ実例

ここからは、実務の現場ですぐに使える具体的な監視ユースケースとコピペ用コマンドを紹介します。

サーバーリソースのリアルタイム監視(メモリ・ディスク容量)

負荷テスト中やバッチ実行中に、サーバーのリソース枯渇を監視するパターンです。

# 2秒ごとにメモリ使用量とスワップ消費を監視
watch -n 2 "free -m"

# 5秒ごとにディスク容量の使用率を監視(急激なファイル肥大化を検知)
watch -n 5 "df -h"

長時間かかる処理を実行している間、別ウィンドウでこの監視を開いておくだけで、空き容量不足による突然のシステム停止を未然に防げます。

変更箇所を一目で把握する差分ハイライト(ファイル増加・更新監視)

大量のファイルが生成されるディレクトリや、ログの更新頻度を監視したい場合は -d オプションが真価を発揮します。

# 2秒ごとにディレクトリ内のファイルを監視し、変更行をハイライト
watch -d -n 2 "ls -lh /var/log/app"

前回の実行結果と比較して「ファイルサイズが増加した箇所」「新しいファイルが追加された行」がターミナル上で反転表示されるため、どのプロセスが動いているかが直感的に分かります。さらに、監視開始時からの変化をすべて見逃したくない場合は、watch -d=cumulative -n 2 "ls -lh /var/log/app" のように累積モードを活用しましょう。

パイプ(|)やリダイレクトを含む複合コマンドの監視テクニック

特定のプロセス数やログの行数をリアルタイムにカウントしたい場合、パイプで複数のコマンドを連結します。grepコマンド や wc と組み合わせるのが定番です。

# Nginxのワーカプロセス数を1秒ごとにカウント
watch -n 1 "ps aux | grep [n]ginx | wc -l"

# システム全体のロードアベレージと上位CPU消費プロセスを監視
watch -n 2 "uptime; echo ''; ps aux --sort=-%cpu | head -n 10"

パイプやセミコロン(;)を使う場合は、必ずコマンド全体をダブルクォートで囲んでください。 クォートを忘れると構文エラーや意図しない挙動を引き起こします。

特定処理の完了を待機する自動終了(バッチ・プロセス終了検知)

「大きなバックアップ処理が終わったら次の作業を行いたい」「サーバーの再起動完了を待ちたい」という場面では、-g(--chgexit)オプションが抜群に役立ちます。

# バックアップ処理(backup.sh)が終了したらwatchを自動終了し、次の処理を実行
watch -g "pgrep -f backup.sh" && echo "バックアップが正常に完了しました!"

出力結果が変わった時点でwatchコマンドが自動終了し、シェル演算子 && によって後続の通知コマンドや次の処理へとシームレスに移行できます。画面に張り付いて待つ無駄な時間をゼロにできる現場直伝のテクニックです。

ログファイルやポート接続状態のリアルタイム監視

サービスの稼働状況やネットワーク接続数を定点観測する実例です。

# Webサーバー(ポート80/443)の確立済みコネクション数を1秒ごとに集計
watch -n 1 "ss -ant | grep ESTAB | wc -l"

# 特定のエラーログの発生件数をリアルタイム監視
watch -d -n 2 "grep 'ERROR' /var/log/nginx/error.log | tail -n 20"

ログファイル全体の継続的な追跡には tailコマンド の tail -f を使うのが基本ですが、「直近のエラー件数」や「特定条件に一致する行の推移」を画面固定で観察したいときは watchコマンドの方が圧倒的に見通しが良くなります。


よくあるエラー・落とし穴と対処法

watchコマンドは手軽な反面、シェルの評価順序に起因するつまずきポイントがいくつか存在します。

落とし穴1:パイプ(|)やエイリアスが動かない罠と解決策

初心者が最も高確率で直面するのが、「パイプで繋いだコマンドが正しく動かない」 というトラブルです。

失敗例(クォートなし)

# 誤った指定:パイプがwatchの外側で解釈されてしまう
watch ps aux | grep nginx

上記のようにクォートで囲まずに実行すると、シェルは watch ps aux というコマンドの実行結果を、バックグラウンドではなく手元の端末側で grep nginx に渡そうとします。その結果、watchの画面クリア制御とgrepの行絞り込みが衝突し、画面がフリーズしたように見えたり、意図した監視が行えなくなります。

正しい解決策

# 正しい指定:ダブルクォートでコマンド全体を1つの文字列として渡す
watch "ps aux | grep nginx"

watchコマンドは内部で sh -c を用いてコマンドを実行します。文字列としてクォートで囲むことで、パイプ処理がwatchの内側で正しく評価されます。

また、普段使っているシェルエイリアス(例: ll など)は、watch内部のサブシェル(標準の sh)には引き継がれません。エイリアスを監視対象に含めたい場合は、以下のようにフルパスで指定するか、bashの対話モード経由で呼び出す必要があります。

# エイリアスを含んだコマンドをwatchで実行する場合
watch "bash -ic 'll'"

落とし穴2:watchの停止方法とバックグラウンド実行時の注意点

watchコマンドの停止は、フォアグラウンドで Ctrl + C(SIGINTシグナル)を送信するのが標準的な手順です。

実務でやってしまいがちな失敗が、コマンド末尾に & を付けてバックグラウンド実行してしまうケースです。

# やってはいけない例:端末制御が乱れる原因
watch -n 1 "free -h" &

watchコマンドはターミナル端末(TTY)のカーソル制御や画面クリアを行う curses/terminfo 系のアプリケーションです。バックグラウンドに回すと端末への描画命令がフォアグラウンドの入力と競合し、プロンプトの改行が壊れたり文字化けを起こす原因になります。

長時間の定期監視を行いたい場合は、バックグラウンド(&)にするのではなく、tmux や screen などのターミナルマルチプレクサ上で別ウィンドウを作成して実行するか、後述の systemctlコマンド と連携した本格的なデーモン化を検討してください。

落とし穴3:macOS環境でwatchコマンドが見つからない場合の導入手順

macOS(Mac環境)のターミナルでwatchコマンドを実行しようとすると、以下のエラーが発生することがあります。

# macOSでwatchを実行したときのエラー
zsh: command not found: watch

watchコマンドはLinux(procps-ngパッケージ)の標準ツールであり、macOSのBSD系標準環境には同梱されていません。Mac環境でwatchコマンドを利用したい場合は、パッケージマネージャーである Homebrew を利用してインストールします。

# Homebrewを使ってwatchコマンドをインストール
brew install watch

# インストール確認
watch --version

これでMac環境でもLinuxとまったく同じオプションでwatchコマンドが使えるようになります。


まとめ&あわせて読みたい関連記事

今回は、定期実行と画面監視を効率化する watchコマンド の使い方を網羅して解説しました。

実務で押さえておくべき最重要ポイントは以下の3点です:

  1. 手動連打やwhileループ監視をやめる: watchコマンドを使えば、画面固定と差分ハイライト(-d)で変化を瞬時に検知できます。
  2. パイプや複合コマンドはダブルクォートで囲む: watch "cmd1 | cmd2" のようにクォートで保護することで、シェルの誤評価を防止します。
  3. -g オプションでバッチ終了待ちを自動化: 出力変化を検知して自動終了させ、&& で後続処理へ繋げることで運用の自動化が進みます。

現場の運用保守において、サーバーのリアルタイム監視は欠かせない業務です。watchコマンド単体だけでなく、以下の関連コマンドと組み合わせることで、障害調査やパフォーマンス監視の精度をさらに引き上げることができます。ぜひあわせて参考にしてください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント