LinuxやmacOSのターミナルを利用してシステム管理や開発作業を行う際、特定のコマンドを繰り返し実行して結果の変化を追いかけたい場面は多々あります。
ログファイルの更新状況をリアルタイムで確認したり、ディスク容量の推移を監視したりする場合に、手動で何度もコマンドを打ち直すのは非効率的です。
このような課題を解決するために標準的なLinuxディストリビューションで広く利用されているのが、watchコマンドです。
watchコマンドを活用することで、指定したコマンドを一定間隔で自動実行し、その出力結果をターミナル上に固定して表示し続けることが可能になります。
本記事では、watchコマンドの基本的な構文から、実務で役立つ便利なオプション、そして具体的な監視シーンを想定した活用例までを詳しく紹介します。
watchコマンドとは
watchコマンドは、指定されたコマンドを定期的に実行し、その結果をターミナルウィンドウにフルスクリーンで表示するためのユーティリティです。
デフォルトでは2秒ごとにコマンドが再実行され、画面上の表示が更新されます。
コマンドの結果がどのように変化したかを視覚的に捉えやすいため、サーバーのステータス監視やデバッグ作業において非常に強力なツールとなります。
基本的な使い方
watchコマンドの最もシンプルな使い方は、実行したいコマンドの前に「watch」を記述することです。
例えば、現在のディレクトリに含まれるファイルの一覧を監視したい場合は、次のように入力します。
# 2秒ごとに ls -l を実行する
watch ls -l
コマンドを実行するとターミナルが監視モードに切り替わり、画面の左上に実行間隔と実行されているコマンド名、右上に現在の時刻が表示されます。
監視を終了して通常のターミナル画面に戻るには、「Ctrl + C」キーを押下してください。
watchコマンドの主要なオプション
watchコマンドには、監視の効率を高めるための便利なオプションが多数用意されています。
これらのオプションを組み合わせることで、ノイズを減らしたり、変化した箇所を特定しやすくしたりすることができます。
実行間隔を変更する(-nオプション)
デフォルトの2秒間隔では更新が早すぎたり、逆に遅すぎたりする場合があります。
このようなときは、-n(または --interval)オプションを使用して、実行間隔を秒単位で指定することが可能です。
# 5秒間隔で実行する場合
watch -n 5 date
なお、多くの環境では最短で0.1秒間隔まで設定が可能ですが、あまりに短い間隔に設定するとシステム負荷が高まる可能性があるため注意が必要です。
変更箇所をハイライトする(-dオプション)
出力結果のどこが変化したのかを瞬時に判断したい場合には、-d(または --differences)オプションが非常に有効です。
このオプションを有効にすると、前回実行時の結果と比較して差異がある部分を反転表示してくれます。
# 変化があった場所を強調表示する
watch -d free -m
メモリの使用量が変動する様子をリアルタイムで追跡する際などに、どの数値が動いたのかが一目で分かるようになります。
ヘッダー情報を非表示にする(-tオプション)
画面上部に表示される「実行間隔」「コマンド名」「現在時刻」などのヘッダーが不要な場合は、-t(または --no-title)オプションを使用します。
出力結果だけをシンプルに表示させたい場合に最適です。
# ヘッダーを表示せずにコマンド結果のみを出す
watch -t uptime
出力に変化があったら終了する(-gオプション)
特定の処理が完了するのを待ちたい場合、-g(または --chgexit)オプションが役立ちます。
このオプションを使用すると、コマンドの出力内容に変化があった時点でwatchコマンドが自動的に終了します。
# ファイルが作成されたり更新されたりしたら終了する
watch -g ls -l test.txt
これにより、スクリプトの中で「特定の状態になるまで待機する」といった処理を簡単に実装できます。
ANSIカラーを有効にする(-cオプション)
実行するコマンド自体が色付きの出力に対応している場合、watch経由ではカラーコードが無視されてしまうことがあります。
-c(または --color)オプションを指定することで、コマンドの出力に含まれるANSIカラーを正しく解釈して表示できます。
# 色付きの出力を保持したまま監視する
watch -c ls --color=always
実務で役立つ具体的な監視シナリオ
ここからは、watchコマンドを具体的にどのようなシーンで活用できるか、実例を挙げて紹介します。
ディスク使用量の監視
大きなファイルをダウンロードしている最中や、ログが急増している際にディスクの空き容量を監視する例です。
watch -n 10 df -h
このコマンドを実行しておくことで、パーティションごとの空き容量の推移を10秒ごとに確認できます。
ディレクトリ内のファイル監視
ビルドプロセスによって生成される成果物や、アップロードされるファイルを監視する際に便利です。
watch -d "ls -lh /path/to/directory"
変化があった箇所がハイライトされるため、新しいファイルが追加されたりサイズが変わったりした際に見逃すことがありません。
ネットワークコネクションの監視
特定のポートに対する接続状況や、現在のネットワークセッションをリアルタイムで把握したい場合です。
watch "ss -ant | grep ESTAB"
ssコマンドの結果をパイプでgrepに渡すことで、確立された接続(ESTABLISHED)のみを抽出して監視し続けることができます。
プロセスとシステムリソースの監視
特定のアプリケーションがどれくらいのCPUやメモリを消費しているかを監視します。
watch "ps aux --sort=-%cpu | head -n 10"
CPU使用率の高い上位10プロセスを常時表示させることができ、システムの負荷状況を的確に把握できます。
watchコマンドでパイプやエイリアスを扱う際の注意点
watchコマンドをより高度に使いこなすためには、シェルの解釈に関する挙動を理解しておく必要があります。
複雑なコマンドを引用符で囲む
パイプ(|)やセミコロン(;)を含むコマンドをwatchに渡す場合、それら全体をダブルクォーテーションなどで囲む必要があります。
囲まない場合、パイプはwatchコマンド自体に対する操作として解釈されてしまい、意図した通りに動作しません。
# 正しい例:コマンド全体を囲む
watch "ls -l | grep txt"
# 誤った例:grepがwatchに対して実行されてしまう
watch ls -l | grep txt
エイリアスが反映されない問題の対策
通常、watchコマンド内でシェルのエイリアス(alias)を直接利用することはできません。
どうしてもエイリアスを使用したい場合は、sh -cを介して実行するか、実行したいコマンドをフルパスで指定するなどの工夫が必要です。
# エイリアスを含んだ複雑な処理を実行させる例
watch "bash -ic 'my_alias_command'"
watchコマンドが使えない環境での代替案
万が一、watchコマンドがインストールされていない軽量なコンテナ環境などでは、Bashのループ処理で代用することができます。
以下のスクリプトは、watchコマンドの基本的な挙動をエミュレートするものです。
# whileループによる定期実行の例
while true; do
clear # 画面をクリア
date # 時刻を表示
df -h # 実行したいコマンド
sleep 2 # 2秒待機
done
watchコマンドほど高機能ではありませんが、一時的な監視用途であれば十分に役立ちます。
まとめ
Bashのwatchコマンドは、シンプルながらも非常に強力な監視ツールです。
-nオプションによる間隔調整や、-dオプションによる差異のハイライトをマスターするだけで、日々の運用管理やトラブルシューティングの効率は飛躍的に向上します。
特にサーバーの負荷状況やログの推移を監視する際には、手動でコマンドを繰り返すのではなく、watchコマンドにその作業を任せるのがスマートな方法です。
本記事で紹介した様々なオプションや実例を参考に、ぜひ日常のコマンドライン操作に取り入れてみてください。
効率的な監視環境を構築することは、予期せぬシステムの異変にいち早く気づくための第一歩となります。
