内容が更新された、ファイルが転送された、消されたなどディレクトリを監視したい場合があります。そのような場合に便利なのがwatchコマンドです。watchコマンドはディレクトリ内容を監視するコマンドではなく、指定されたコマンドを定期的に実行します。lsなどと組み合わせて利用することで簡易的にディレクトリを監視できます。
なお、watchコマンドはmacOSには入っていません。Apple Watchというハードウェアはあるのにソフトウェアのコマンドとしてwatchは用意されていません。とは言え、watchコマンドがなくても検索するとシェルスクリプトで似たような機能を実現することもできます。検索するといくつか出てくるので、それらを利用するのも良いでしょう。

今回watchコマンドを実行するのはRaspberry Pi OS上です(一部Windows/macOSもあります)。Linux系であれば動作するので好みの環境・ディストリビューションで実行してください。今回は作業用のディレクトリなどは特にありません。ただし、監視対象とするディレクトリ等にはアクセス権があるというのが前提条件です。

現在のディレクトリを監視

 それでは現在のディレクトリを監視してみましょう。ここではデスクトップ上にあるsampleディレクトリにしてみます。現時点ではsampleディレクトリの内容は図のようになっていて何もファイル・ディレクトリ(フォルダ)はありません。

現在のディレクトリを監視するには以下のように入力します。

watch ls

コマンドを入力すると2秒毎にlsコマンドが実行されます。lsコマンドは現在のディレクトリ内容を表示するので、watchコマンドと組み合わせることでディレクトリの監視ができるということになります。
それでは、この監視中の状態のままsampleディレクトリに何かファイルを移動させてみましょう。デスクトップ上にあるファイルを1つ移動させます。

この状態でwatchとlsコマンドを実行しているターミナル(ウィンドウ)を確認してみましょう。移動したファイル名が表示されています。

watch lsとしているのでファイルの詳細情報は表示されません。ファイルの詳細情報も表示する場合はwatch ls -lのようにオプションを指定します。なお、現在実行しているwatchを停止するにはコントロールキーを押したままCキーを押します。

停止したのを確認したら以下のように入力します。

watch ls -l

今度はファイルの詳細情報もリアルタイムに表示されています。
なお、場合によってはシングルクオートでコマンドとオプションを囲まないと期待通りの結果にならない場合があります。

監視時間の間隔を調整する

 watchコマンドはデフォルトでは2秒間隔で与えられたコマンドを実行します。この間隔はオプションで指定することができます。
実行間隔を指定するにはnオプションを使います。-nの後に秒数を指定します。0.5など1秒よりも短い間隔にすることもできます。
以下のように指定すると5秒毎にディレクトリの内容が更新されます。

watch -n 5 ls -l

変更部分をハイライトする

 watchコマンドで監視していると、どこが変更されたか示してくれると便利だなと思うかもしれません。そんな時に便利なのがdオプションです。-dをつけると変更部分がハイライトされます。lsでは変更箇所がわかりにくいので仮想メモリやCPU、ディスクI/Oの統計情報を表示するvmstatコマンドで監視してみましょう。

watch -d vmstat

 ちなみにvmstatはwatchを使わなくても定期的に状態を表示することができます。vmstatの後に秒数を指定するだけです。以下のようにすると2秒ごとに情報が表示されていきます。

vmstat 2

 ちなみにmacOSの場合はvmstatではなくvm_statを使います。

vm_stat

 2秒間隔で表示する場合はvmstatと同様にコマンドの後に秒数を指定します。以下のようにすると2秒ごとに情報が表示されていきます。

vm_stat 2

プロセスを監視する

 次にプロセスを監視してみましょう。プロセスの表示はpsコマンドを使います。より詳細に表示したいのでps -axとオプションを指定します。(ps -axlでも可)

watch ps -ax

 数多くのプロセスがある場合、特定の文字列を含むプロセスだけ表示させることもできます。これはgrepと組み合わせます。ここで注意点としてwatchコマンドの後に指定する実行内容に|などの文字があると期待する動作にならないということです。このような場合は'または"で実行するコマンドを囲むようにします。

watch "ps -ax | grep 'pts'"

ちなみにプロセスを監視するだけならwatchコマンドでなくtopを使った方が簡単で詳細な情報を得ることができます。

top

プロセスついでにプロセスツリーを表示したい場合はpstreeを使います。なお、pstreeはmacOSにはありません。pstreeをmacOSでも使用したい場合はHomeBrewなどでインストールしてください。

pstree

 Windows場合はコマンドからtasklistと入力するとプロセス一覧が表示されます。

tasklist

 Windows/macOSなどで使えるPowerShellの場合はGet-Processと入力するとプロセス一覧が表示されます。

Get-Process

Windows 10

macOS

ラズベリーパイの温度を監視する

 最後にwatchコマンドを使ってラズベリーパイの温度を監視してみましょう。ラズベリーパイの温度はvcgencmdコマンドを使えば簡単です。vcgencmdコマンドの後にオプションでmeasure_tempを指定します。

vcgencmd measure_temp

 定期的に温度を表示するにはwatchコマンドの後にvcgencmd measure_tempを指定するだけです。これで簡単にラズベリーパイの温度を監視できます。

watch vcgencmd measure_temp

vcgencmdは他にも電圧やクロックなども表示できます。man vcgencmdとすると使用できるオプションが表示されます。

man vcgencmd

 温度以外では以下のような表示が可能です。他にもカメラ等に関する情報を表示することもできます。

・CPU温度
vcgencmd measure_temp

・CPU周波数(クロック数)
vcgencmd measure_clock arm

・CPU電圧
vcgencmd measure_volts

・CPUのメモリ使用量
vcgencmd get_mem arm

・GPUのメモリ使用量
vcgencmd get_mem gpu

 CPU温度だけでなく同時に電圧なども監視したい場合には;で区切ってvcgencmdコマンドを記述していきます。その際に必ず'または"で囲んでください。囲まないと;がコマンドの区切りとみなされてしまい、最初に指定したvcgencmdコマンドだけが定期的に実行されてしまいます。

watch 'vcgencmd measure_temp;vcgencmd measure_volts'

watchコマンドを利用すればcronなしで定期的にシェルスクリプトを実行させることも簡単にできます。アイデアと使い方次第では便利なコマンドです。
ちなみにWebサーバーのログ監視であればtailとgrepの定番の組み合わせもあります。ただ、便利なツールがあるなら、そちらを使った方がいいでしょう。プロセスもテスクマネージャー使った方が見た目にもわかりやすくて簡単です。(macOSならアクティビティモニタ)

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。