【システム監視に役立つ】watchコマンドの基本と実践例

Linuxのwatch コマンドは、指定したコマンドを定期的に実行し、その結果をリアルタイムで表示するシンプルながら強力なツールです。本記事ではwatch コマンドの基本的な使い方と、実現場で使える応用例を紹介します。

目次

基本的な使い方

watch コマンドの基本的な構文は以下の通りです。

watch [option] command 

デフォルトでは2秒ごとに繰り返すため、以下のコマンドでは2秒ごとに現在のシステムの日時を表示し続けます。

watch date
Every 2.0s: date                     instance-20240127-2028: Sat May 11 10:37:14 2024

Sat May 11 10:37:14 UTC 2024

時間を指定する場合はn オプションを使います。以下の場合は4秒ごとに日時を出力します。

watch -n 4 date
Every 4.0s: date                     instance-20240127-2028: Sat May 11 10:37:29 2024

Sat May 11 10:37:29 UTC 2024

複数のコマンドを実行する場合は"" で囲みます。

watch "echo hello"

watch コマンドの応用

先述したようにwatch はコマンドを定期実行するシンプルなコマンドです。また、単に定期実行というよりは、定期実行した結果を画面に表示して継続的に更新するという仕組みなので、"watch" の名の通り、誰かが比較的短い時間、リアルタイムで何かを簡単に監視するユースケースに適しているコマンドと言えます。そうでなければwhile とsleep を使ったシェルスクリプトやcron を使うべきです。

ディレクトリの監視

あるアプリケーションが何かしらの処理を完了したタイミングでファイルが作成されるケースはよくあります。ここで、そのファイルが作成されたのを確認してから次の手順に入りたいときに、ls を連打してもいいのですが、こういう時こそwatch が使えます。

watch -d=cumulative  ls

d オプションは前回からの変更をハイライト表示します。cumulative を指定すると、ハイライト表示が次の更新間隔を超えても残ります。つまり、このケースの場合は2秒ごとにls を実行しているわけですが、新しいファイルができたときにそのファイル名が強調表示されます。下記のケースの場合はtest-3.txt を新しく作成しました。

cumulative を指定しない場合は、ファイルの作成を検知してハイライト表示はされるのですが、次の2秒後には差分が検出されないのでハイライト表示が消えます。更新間隔によっては少し気を抜いたときにハイライトが消えて更新部分が分からなくなってしまうリスクがあるので、必要に応じてcumulative をうまく使ってください。

ls ではなくfind と組み合わせることで、ファイル作成の検知というユースケースに対してfind の柔軟なフィルタリング機能を利用することもできます。例えば下記は/var/log 配下で10分以内に作成された.log という拡張子を持つファイルを定期的に出力します。

watch "find /var/log -type f -name '*.log' -mmin -10"

メモリの監視

free コマンドはシステムのメモリの使用状況を出力します。

ubuntu:~$ free
              total        used        free      shared  buff/cache   available
Mem:         975096      367860       78120        1172      529116      446368
Swap:             0           0           0

free の-s オプションは出力の間隔を時間指定するのですが、画面に対して継続的に出力が積み重なっていくため、結構見づらいです(以下は2秒ごとにfree の結果を出力しています)。

ubuntu:~$ free -s 2
              total        used        free      shared  buff/cache   available
Mem:         975096      368836       77112        1172      529148      445392
Swap:             0           0           0

              total        used        free      shared  buff/cache   available
Mem:         975096      368836       77112        1172      529148      445392
Swap:             0           0           0

              total        used        free      shared  buff/cache   available
Mem:         975096      368836       77112        1172      529148      445392
Swap:             0           0           0

watch コマンドは出力のたびに画面を更新するので、今のメモリの状態をより直感的に理解することができます。

ubuntu:~$ watch -t free -h 
              total        used        free      shared  buff/cache   available
Mem:          952Mi       357Mi        78Mi       1.0Mi       516Mi       437Mi
Swap:            0B          0B          0B

なお、watch のt オプションはヘッダを省略します。

ディスク容量の監視

df と組み合わせることで、ディスク容量を追跡できます。ただしメモリほど変化はないので、定期実行したいユースケースは限られると思います。

ubuntu:~$ watch -t df -h 
Filesystem      Size  Used Avail Use% Mounted on
udev            446M     0  446M   0% /dev
tmpfs            96M  1.2M   95M   2% /run
/dev/sda1        45G  4.0G   42G   9% /
tmpfs           477M     0  477M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           477M     0  477M   0% /sys/fs/cgroup
/dev/sda15      105M  6.1M   99M   6% /boot/efi
/dev/loop3       78M   78M     0 100% /snap/oracle-cloud-agent/70
/dev/loop4       56M   56M     0 100% /snap/core18/2812
/dev/loop6       40M   40M     0 100% /snap/snapd/21184
/dev/loop2       78M   78M     0 100% /snap/oracle-cloud-agent/72
/dev/loop1       39M   39M     0 100% /snap/snapd/21465
/dev/loop5       56M   56M     0 100% /snap/core18/2823
tmpfs            96M     0   96M   0% /run/user/1001

プロセスの監視

これはよく使うと思います。ps でプロセスの状態を監視できますが、watch やgrep を使うことで、プロセスの状態をリアルタイムで追跡できます。アプリケーションを構成するプロセスが問題なく立ち上がるか確認するときなどに使えます。

ubuntu:~$ watch -t "ps aux | grep httpd" 
ubuntu   1384806  0.0  0.3   5112  3144 pts/0    S+   08:25   0:00 watch ps aux | grep httpd
ubuntu   1384821  0.0  0.1   5112  1140 pts/0    S+   08:25   0:00 watch ps aux | grep httpd
ubuntu   1384822  0.0  0.0   2616   600 pts/0    S+   08:25   0:00 sh -c ps aux | grep httpd
ubuntu   1384824  0.0  0.0   5196   720 pts/0    S+   08:25   0:00 grep httpd

Docker コンテナの監視

コンテナを立ち上げた際に状態確認のためdocker ps はよく実行すると思いますが、docker ps に定期実行のオプションはないため、watch を使うといい感じです。

ubuntu:~$ watch -t "docker ps" 
CONTAINER ID   IMAGE          COMMAND          CREATED        STATUS        PORTS                                       NAMES
eb3f72546993   my-tinyproxy   "tinyproxy -d"   3 months ago   Up 3 months   0.0.0.0:8888->8888/tcp, :::8888->8888/tcp   my-tinyproxy-instance

まとめ

本記事ではlinux のwatch コマンドの基本的な使い方と、その応用例を紹介しました。watch コマンドはシンプルで覚えることも少なく、かつ柔軟性に優れているので、これまで使っていなかった人も気軽に導入できるのではないでしょうか。ぜひ今後のシステム監視ライフに活かしてみてください。