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 コマンドはシンプルで覚えることも少なく、かつ柔軟性に優れているので、これまで使っていなかった人も気軽に導入できるのではないでしょうか。ぜひ今後のシステム監視ライフに活かしてみてください。