Linux / コマンド / watch - コマンドの結果を一定間隔で確認する

watchは、指定したコマンドを一定間隔で繰り返し実行し、その結果を端末全体の画面に更新して表示するコマンドです。基本の実行間隔は2秒で、-nで間隔を変更し、-dで前回の結果と異なる部分を強調できます。

メモリ・ディスク・プロセス・ネットワークの状態のように、絶えず変化する値を短時間観察する際に便利です。終了するには通常、qまたはCtrl+cを使用します。

watchコマンドとは?

watchはprocps-ngツール集に含まれるプログラムです。指定したコマンドを繰り返し実行し、その標準出力と標準エラーの最初の画面分を表示するため、同じコマンドを何度も手入力することなく結果の変化を確認できます。

上部のヘッダーには実行間隔やコマンドなどが表示されます。表示項目はバージョンによって異なり、現在の上流マニュアルでは開始時刻・実行時間・終了コードも説明されています。実行結果が画面より長い場合、表示されない部分が出るため、長いログや大量出力全体を追跡する用途には他のツールの方が適している場合があります。

基本動作と現在のオプションは、watch(1) マニュアルおよび procps-ng の watch マニュアルソースで確認できます。

基本的な文法と使い方

watch [オプション] コマンド [コマンドの引数...]

オプションなしで free -h を繰り返し実行すると、デフォルトで2秒ごとにメモリ使用量を更新します。

watch free -h

1秒間隔で実行するには、-n オプションを追加します。

watch -n 1 free -h

watch オプションは、繰り返すコマンドの前に配置する必要があります。コマンドの後に書いたオプションは通常 watch ではなく、繰り返し実行されるコマンドのオプションとして渡されます。

よく使うオプション

オプション 機能 活用方法
-n 秒 実行間隔の指定 watch -n 1 コマンド のように秒単位の値を指定します。
-d 変更された部分を強調 直前の画面と比較して変更された文字を目立つように表示します。
-d=permanent 累積変更強調 最初の実行以降、一度でも変更された部分をずっと強調します。
-g 出力が変わったら終了 ファイルや状態が変わるまで待つ目的で使用できます。
-e コマンドエラー時は更新を停止 繰り返しコマンドが0以外の状態で終了した場合、画面を止めてキー入力後に終了します。
-b コマンドエラー時に通知音 繰り返しコマンドが0以外の状態を返した場合、ターミナルベルを鳴らします。
-p 正確な開始間隔を試みる 前回の実行の開始時点を基準に指定した間隔に合わせて実行します。
-t 上部タイトルを非表示 コマンド結果を表示するスペースを少し多く確保します。
-c ANSIカラーの解釈 繰り返しコマンドが出力する対応可能な色とスタイルを表示します。
-w 長い行の折り返しを防ぐ 画面幅を超える行を次の行に折り返さずに切り取って表示します。
-x シェルを経由せずに実行 sh -c の代わりにプログラムを直接実行して、シェル拡張やパイプを使用しません。

配布版に含まれる procps-ng のバージョンによってサポートされるオプションが異なる場合があります。現在のシステムで使用できるオプションは、次のコマンドで確認します。

watch --help
watch --version

間隔と出力の変化を制御する

-n で実行間隔を指定

-n または --interval の後に秒単位の値を指定します。小数も使用できますが、あまりに短い間隔は CPU、ディスク、ネットワークおよび対象サービスに不必要な負荷をかける可能性があります。

watch -n 0.5 date
watch -n 5 df -h

間隔を省略すると、デフォルトは 2 秒です。現在の procps-ng マニュアルでは極端に小さすぎる値や大きすぎる値に制限を適用しており、具体的な範囲はインストールされているバージョンで確認することをお勧めします。

-dで変更された部分を強調

-dは現在の画面を直前の画面と比較し、変更された部分を強調表示します。値が急速に変化するメモリや、プロセスおよびネットワークの統計を見るときに便利です。

watch -n 1 -d free -h

最初の画面以降に変更されたすべての位置を引き続き表示するには、インストールされているバージョンがサポートしている場合に-d=permanentを使用します。

watch -n 1 -d=permanent free -h

-gで変更されると終了

-gまたは--chgexitは、画面に表示される出力が異なる場合、watchを終了します。ファイルの修正時刻や配布作業の状態が変わるのを待つときに使用できます。

watch -g -n 1 'stat -c %Y /tmp/result.txt'

出力が画面の範囲を超えて切れている部分でのみ変化する場合、変化を検知できないことがあります。変化の検知が重要な自動化では、画面の出力の比較よりも、対象コマンドの終了状態や専用のモニタリングツールを使用するほうが安全です。

パイプやシェル構文を使用する際に引用符が必要な理由

基本的にwatchは、渡されたコマンドをsh -cを通して実行します。パイプ、リダイレクション、セミコロン、変数やワイルドカードを繰り返し命令の一部として使用する場合は、コマンド全体をシングルクォートで囲むほうが明確です。

単純なコマンドはそのまま渡す

パイプやリダイレクションがないコマンドは、次のようにすぐに書くことができます。

watch -n 2 ls -lh /var/log

パイプと変数は全体のコマンドをまとめる

次の例では、シングルクォートは現在のシェルがパイプを先に処理しないように防ぎ、繰り返し実行されるシェルに全体のコマンドを渡します。

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

リダイレクションや複数のコマンドも同じ方法でまとめます。

watch -n 5 'date; df -h / /var'

-x オプションはシェルを経由せずにプログラムを直接実行します。実行コストを少し減らしたり、引数の渡し方を簡略化したりできますが、パイプ、リダイレクション、変数展開やワイルドカードなどのシェル機能は使えません。ただし、引用符で保護していない変数やワイルドカードは、watch に渡される前に起動元のシェルで展開されることがあります。

watch -x -n 2 ls -lh /var/log

クォートの一般的な動作はGNU BashのQuotingドキュメントで確認できます。

実務でよく使う例

以下の例では、使用するコマンドがインストールされていることが前提です。/tmp/result.txt と archive.tar は確認対象として実在するファイルに置き換え、nginx は systemd で管理する実際のサービス名に置き換えます。https://example.com/health も説明用の URL なので、自分が監視する権限を持つ確認先を指定してください。

確認対象 説明
メモリ free -h の結果を1秒ごとに更新し、変化した部分を強調します。
ディスク容量 ルートおよび /var ファイルシステムの使用量を5秒ごとに確認します。
CPU使用プロセス ps の結果をCPU使用率の順に並べて上位の項目を確認します。
ソケットの概要 ネットワークソケットの集計情報をss -sで繰り返し確認します。
ファイルサイズ ダウンロードや圧縮ファイルのサイズ変化をstatで観察します。
サービスの状態 --no-pagerと共にsystemctl statusを繰り返し実行します。

メモリ使用量

watch -n 1 -d free -h

ディスク使用量

watch -n 5 'df -h / /var'

CPU 使用率が高いプロセス

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

ネットワークソケットの概要

watch -n 1 ss -s

ファイルサイズと修正日時

watch -n 1 'stat -c "%s bytes  %y" archive.tar'

サービスの状態

watch -n 2 'systemctl --no-pager --full status nginx'

サービス状態のように出力が長くなる可能性のあるコマンドは、ターミナルのサイズによって一部しか表示されない場合があります。継続的なログ追跡が目的であれば、journalctl -f -u nginxのようにその機能に適したコマンドの方が適切です。

正確な実行間隔と時間のかかるコマンド

通常は、1回のコマンド実行が終了してから指定した間隔を待ち、次の実行を開始します。-p または --precise を使用すると、前のコマンドが開始した時点を基準に次の開始時刻を調整しようとします。

watch -p -n 10 'date; curl -fsS https://example.com/health'

繰り返しコマンドの実行時間が指定された間隔より長い場合、watch は同時に複数を重ねて実行せず、現在のコマンドが終了するのを待ちます。正確な周期と実行の保証が必要なバッチ作業には、watch よりも systemd タイマーやタスクスケジューラーを使用する方が適しています。

キーボードで操作する

キー 動作
q watchを終了します。実行中の子コマンドは即座に中断されない場合があります。
Ctrl+c 割り込みシグナルを送信してwatchと実行中の作業を終了します。
Space 次の予約時刻を待たずにコマンド実行を要求します。すでに実行中であれば、完了後に次の実行を遅延なしで開始します。

キー操作はprocps-ngのバージョンによって異なる場合があるため、まず現在のシステムのman watchを確認してください。

watchを使用する際の注意点

  • 読み取り専用確認コマンドに優先して使用: 削除、支払い、ユーザー作成、サービス再起動など状態を変更するコマンドを繰り返すと望ましくない結果が発生する可能性があります。
  • あまりに短い間隔は避ける: データベース問い合わせ、リモートAPIリクエスト、大きなディレクトリの検索を非常に短い周期で実行すると、システムや外部サービスに負荷をかける可能性があります。
  • 画面に表示される範囲の確認: -g と -d はターミナルに表示される出力の影響を受けるため、切り取られた領域の変化を検出できない場合があります。
  • 対話型コマンドを避ける: パスワード入力、エディタ、ページャのようにユーザー入力を待つプログラムは繰り返し実行には適していません。
  • 終了状態の区別: 基本的な watch の成功状態が繰り返しコマンドの成功を常に意味するわけではありません。コマンドエラーに反応する必要がある場合は、-e など現在のバージョンのオプションを確認します。

watch の代わりに他のツールが適している場合

目的 適したツール
ファイルに追加されるログの追跡 tail -f または tail -F
systemd サービスログの追跡 journalctl -f -u サービス名
プロセスのリソース使用量確認 top または htop
決まった時刻の繰り返し作業 systemdタイマーまたはcron
長期指標の収集と通知 専用のモニタリングシステム

watchは人が端末を見ながら短時間の変化を確認するのに適しています。記録の保持、通知、長期分析が必要な場合は、目的に合ったツールを選択する必要があります。

よくある質問

watchコマンドがないと表示されます

watchは通常procpsまたはprocps-ngパッケージに含まれています。最小インストール環境にはない場合があるため、現在のディストリビューションのパッケージマネージャで該当パッケージをインストールする必要があります。パッケージ名とインストールコマンドはディストリビューションの文書を確認してください。

エイリアスやシェル関数はwatch内で実行されません

エイリアスや関数は現在の対話型シェルにのみ定義されている場合があり、watchが基本的に呼び出すsh -c環境には渡されないことがあります。繰り返し作業は、実際の実行ファイル、明示的なコマンド、または別のシェルスクリプトとして作成する方が予測しやすいです。

コマンドの色が表示されません

watch -cでANSI色の解釈を有効にし、繰り返しコマンドも非対話型環境で色コードを出力するよう設定する必要があります。プログラムによっては、--color=alwaysのような別のオプションが必要な場合があります。

パイプを含むコマンドはなぜ引用符で囲む必要があるのですか?

引用符がないと、現在のシェルがパイプを先に処理し、watchの出力全体が別のコマンドに渡される可能性があります。パイプライン全体をシングルクォートで囲むと、watchが繰り返し実行するシェルに1つのコマンド文字列として渡すことができます。

まとめ

watchは、コマンドの結果を基本的に2秒間隔で繰り返し表示する簡単な監視ツールです。-nで周期を変え、-dで変化を強調し、-gで出力が変わったときに終了することができます。

パイプやリダイレクトを含むコマンドは、全体をシングルクォートで囲み、繰り返し実行がシステムに与える負荷や副作用を確認する必要があります。他のコマンドの用途は、Linuxコマンド一覧で作業別に確認できます。