はじめに
watch コマンドは、Linux システムにおける強力なユーティリティで、ユーザーが定期的にコマンドを実行し、その出力をターミナルに表示することができます。このツールは、システムリソースの監視、ファイルの変更の追跡、または定期的に出力を生成するプロセスの観察に特に役立ちます。
この実験では、watch コマンドを使用して繰り返しタスクを自動化し、システムの変更を監視する方法を学びます。構文、オプション、および実際のシナリオでの実用的なアプリケーションを理解します。この実験の終わりまでに、システムの変更を効率的に観察するための自動監視プロセスを設定できるようになります。
watch コマンドの基本を理解する
watch コマンドを使用すると、指定した間隔で別のコマンドを繰り返し実行することができます。これは、変化する状況を監視したり、時間の経過とともにコマンドの出力を観察する必要がある場合に便利です。
まず、watch コマンドの基本構文を見てみましょう。
watch [options] command
一般的なオプションは以下の通りです。
-n <seconds>: 更新間隔を秒単位で指定します(デフォルトは 2 秒)-d: 更新間の変更部分を強調表示します-t: コマンドと現在時刻を表示するヘッダーを非表示にします
watch コマンドの動作を説明するために、簡単な例を作成してみましょう。まず、作業ディレクトリに移動します。
cd ~/project
次に、実行するたびに乱数を生成する簡単なスクリプトを作成します。これにより、watch コマンドがコマンドを繰り返し実行する仕組みを視覚的に理解しやすくなります。以下の内容で generate_number.sh というファイルを作成します。
nano ~/project/generate_number.sh
nano エディタで、以下の内容を入力します。
#!/bin/bash
echo "Random number: $((RANDOM % 100 + 1))" > ~/project/number.txt
cat ~/project/number.txt
Ctrl+O を押してから Enter キーを押してファイルを保存し、Ctrl+X を押して nano エディタを終了します。
次に、スクリプトを実行可能にします。
chmod +x ~/project/generate_number.sh
スクリプトが何をするかを確認するために、一度実行してみましょう。
~/project/generate_number.sh
出力には 1 から 100 までの乱数が表示されるはずです。
では、watch コマンドを使用して、このスクリプトを 3 秒ごとに実行しましょう。
watch -n 3 ~/project/generate_number.sh
コマンドの出力が 3 秒ごとに更新され、毎回新しい乱数が表示されるのがわかります。上部のヘッダーには、実行されているコマンドと現在時刻が表示されます。
watch コマンドを終了するには、Ctrl+C を押します。
次に、-d オプションを使用して変更部分を強調表示する例を試してみましょう。
watch -n 3 -d ~/project/generate_number.sh
更新間で出力の変更部分が強調表示されるのがわかります。これは、大量の出力を監視して、何が変更されたかをすぐに識別する必要がある場合に特に便利です。
watch を使ったシステムリソースの監視
watch コマンドの最も一般的な用途の 1 つは、システムリソースの監視です。このステップでは、watch を使って基本的なシステム情報を監視する方法を学びます。
まず、free コマンドを使ってシステムのメモリ使用量を監視してみましょう。
watch -n 2 free -m
上記のコマンドは、メモリ使用量をメガバイト単位 (-m) で表示し、出力を 2 秒ごとに更新します。これは、時間の経過に伴うメモリ消費量を監視するのに便利です。
Ctrl+C を押して watch コマンドを終了します。
次に、ディスク使用量を監視してみましょう。
watch -n 5 df -h
このコマンドは、ディスク使用量を人間が読みやすい形式 (-h) で表示し、5 秒ごとに更新します。システムの異なるパーティションの使用可能な空き容量と使用済み容量を確認できます。
Ctrl+C を押して watch コマンドを終了します。
システム上で実行中のプロセスを監視することで、別の便利なアプリケーションを探ってみましょう。
watch -n 3 "ps aux | head -10"
このコマンドは、CPU 使用量でソートされた上位 10 個のプロセスを表示し、3 秒ごとに更新します。複雑なコマンドを引用符で囲んで、watch と正しく動作するようにしていることに注意してください。
Ctrl+C を押して watch コマンドを終了します。
ファイルの変更を監視するための特定のディレクトリを作成してみましょう。
mkdir -p ~/project/monitor_dir
touch ~/project/monitor_dir/file1.txt
では、watch を使ってディレクトリの変更を監視しましょう。
watch -n 2 "ls -l ~/project/monitor_dir"
このコマンドをターミナルで実行したままにします。次に、新しいターミナルを開き、監視対象のディレクトリに新しいファイルを作成します。
touch ~/project/monitor_dir/file2.txt
最初のターミナルの watch コマンドが自動的に更新され、新しいファイルが表示されるのを観察してください。これは、watch がディレクトリの変更をリアルタイムで監視するためにどのように使用できるかを示しています。
最初のターミナルで Ctrl+C を押して watch コマンドを終了します。
watch コマンドの高度な機能
このステップでは、watch コマンドのいくつかの高度な機能について学びます。これらの機能を使うと、監視タスクをより効率的に行うことができます。
まず、コマンドと現在時刻を表示するヘッダーを非表示にする -t オプションを見てみましょう。
watch -n 3 -t date
ヘッダーが非表示になり、コマンドの出力のみがクリーンに表示されることがわかります。これは、出力の表示スペースを最大化したい場合に便利です。
Ctrl+C を押して終了します。
次に、-g または --chgexit オプションを使った watch の使い方を見てみましょう。このオプションを使うと、コマンドの出力が変化したときに watch が終了します。
touch ~/project/test_change.txt
watch -g -n 1 "ls -l ~/project/test_change.txt"
このコマンドが実行されている間に、新しいターミナルを開き、ファイルを変更します。
echo "hello" > ~/project/test_change.txt
最初のターミナルの watch コマンドは、ファイルの変更を検出すると自動的に終了するはずです。
もっと実用的な例を作ってみましょう。時折エラーが発生するログファイルをシミュレートするスクリプトを作成します。
nano ~/project/simulate_logs.sh
nano エディタで、以下の内容を入力します。
#!/bin/bash
LOG_FILE=~/project/application.log
## Initialize log file
echo "Starting log simulation" > $LOG_FILE
## Generate simulated log entries
for i in {1..10}; do
echo "[$(date)] - INFO: Normal operation $i" >> $LOG_FILE
sleep 1
## Occasionally generate an error
if ((i % 3 == 0)); then
echo "[$(date)] - ERROR: Something went wrong!" >> $LOG_FILE
fi
done
echo "Log simulation complete" >> $LOG_FILE
nano を保存して終了し (Ctrl+O、Enter、Ctrl+X)、スクリプトを実行可能にします。
chmod +x ~/project/simulate_logs.sh
では、watch と grep を使って、ログファイル内のエラーメッセージを監視しましょう。
watch -n 1 "grep ERROR ~/project/application.log || echo 'No errors found'"
別のターミナルで、ログシミュレーションスクリプトを実行します。
~/project/simulate_logs.sh
最初のターミナルで、ログファイルにエラーメッセージが表示される様子を見てみましょう。これは、watch を使ってログをリアルタイムで監視する実用的な例です。
Ctrl+C を押して watch コマンドを終了します。
最後に、watch をバックグラウンドで実行し、その出力をファイルにリダイレクトする方法を見てみましょう。
watch -n 5 date > ~/project/date_output.txt 2>&1 &
このコマンドは、watch コマンドをバックグラウンドで実行し、日付を 5 秒ごとに更新して出力をファイルに保存します。ファイルの内容を確認することができます。
cat ~/project/date_output.txt
バックグラウンドで実行されている watch プロセスを停止するには、その PID を見つけて終了させます。
ps aux | grep "watch -n 5 date"
kill <PID> ## Replace <PID> with the actual process ID number
これらの例は、様々な監視タスクに対する watch コマンドの汎用性を示しています。
まとめ
この実験では、Linux の watch コマンドを使って、指定した間隔でコマンドを繰り返し実行する方法を学びました。この強力なユーティリティは様々な監視タスクに使用でき、システム管理者や Linux ユーザーにとって不可欠なツールとなります。
この実験でカバーされた主要な概念は以下の通りです。
-nで間隔を指定し、-dで変更部分を強調表示するなど、様々なオプションを使ったwatchコマンドの基本的な使い方。free、df、psなどのコマンドと組み合わせて、watchを使ってメモリ使用量、ディスク空き容量、実行中のプロセスなどのシステムリソースを監視する方法。watchを使ってファイルやディレクトリの変更をリアルタイムで監視する方法。- ヘッダーなしで実行する (
-t)、変更を検出したら終了する (-g)、特定の監視ニーズに応じて他のコマンドと組み合わせるなど、watchの高度な機能。 watchをバックグラウンドで実行し、その出力をファイルにリダイレクトする方法。
watch コマンドは、変化する状況を監視したり、コマンドの出力を自動的に更新する必要があるときに、時間と労力を節約できる汎用性の高いツールです。ターミナル出力を生成するあらゆるコマンドと連携できる特性から、システム管理からアプリケーション開発やデバッグまで、幅広いシナリオに適用できます。



