メインコンテンツへスキップ
初級10分で読める

watchコマンドで定期的にコマンド実行

コマンドを定期的に実行してリアルタイムモニタリングを実現するwatchコマンドの使い方を、システム監視やプロセス管理の実例を交えて詳しく解説します。

システム編watchモニタリング自動実行システム監視ツール

🎯 この記事で学べること

  • 1
    watchコマンドの基本的な使い方をマスターできます
  • 2
    コマンドの実行間隔を自由に設定できるようになります
  • 3
    変更部分のハイライト表示機能が活用できます
  • 4
    システム監視やログ監視に応用できます
  • 5
    cronとの使い分けが理解できます

読了時間: 約10

watchコマンドとは

watchコマンドは、指定したコマンドを定期的に実行し、その出力を画面に表示し続ける便利なツールですね。

システムの状態やファイルの変化をリアルタイムで監視したい時、手動で何度もコマンドを実行するのは大変ですよね。watchコマンドを使えば、自動で定期的にコマンドを実行して、結果を更新してくれます。デフォルトでは2秒ごとに更新されますよ!

基本的な使い方

基本構文

まずは、watchコマンドの基本的な使い方から見ていきましょう。とてもシンプルですよ:

# 基本的な使い方
watch command

# 日時を2秒ごとに表示
watch date

# ディレクトリの内容を監視
watch ls -la

# プロセスの状態を監視
watch 'ps aux | grep nginx'

💡 ポイント: パイプを含むコマンドはクォートで囲む必要があります。終了する時はCtrl+Cを押しましょう!

実行間隔の指定

デフォルトの2秒間隔を変更したい場合は、-nオプションを使います:

# 1秒ごとに実行(-n オプション)
watch -n 1 date

# 5秒ごとに実行
watch -n 5 df -h

# 0.5秒ごとに実行(小数も指定可能)
watch -n 0.5 'ls -la | wc -l'

# 10秒ごとにメモリ使用状況を確認
watch -n 10 free -h

🎯 使い分けのコツ:

  • 変化が速いものは短い間隔(0.5~1秒)
  • システム負荷が高いコマンドは長い間隔(5~10秒)

便利なオプション

変更部分のハイライト(-d)

watchコマンドの便利な機能の一つが、変更部分のハイライト表示です。-dオプションを使うと、前回の出力との差分が目立つように表示されます:

# 前回との差分をハイライト表示
watch -d ls -la

# ファイルサイズの変化を監視
watch -d 'du -sh *'

# ネットワーク接続の変化を監視
watch -d 'netstat -an | grep ESTABLISHED'

# プロセス数の変化を確認
watch -d 'ps aux | wc -l'

🔍 便利な使い方: ファイルの追加・削除やプロセスの起動・終了など、変化を見逃したくない時に特に便利です!

ヘッダーの非表示(-t)

# タイトル(ヘッダー)を非表示
watch -t date

# クリーンな出力
watch -t -n 1 'echo "CPU Usage:"; top -bn1 | head -5'

# 全画面表示に適した形式
watch -t 'cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable"'

実践的な使用例

システムモニタリング

システム管理では、リアルタイムでの監視が重要です。watchコマンドを使った実用的な例を見ていきましょう:

# CPU使用率の監視
watch -n 1 'top -bn1 | head -10'

# メモリ使用状況の監視
watch -n 2 'free -h'

# ディスク使用量の監視
watch -n 5 'df -h'

# ロードアベレージの監視
watch -n 1 'uptime'

# 総合的なシステム状態
watch -n 2 'echo "=== SYSTEM STATUS ==="; uptime; echo; free -h; echo; df -h /'

📋 実務でのポイント: システムに問題が発生した時、これらのコマンドでリアルタイム監視をすると、原因特定が素早くできますよ!

プロセス管理

# 特定プロセスの監視
watch -n 1 'ps aux | grep apache2 | grep -v grep'

# プロセス数のカウント
watch -n 2 'echo "Apache processes: $(pgrep -c apache2)"'

# メモリ使用量TOP10
watch -n 3 'ps aux --sort=-%mem | head -11'

# CPU使用量TOP10
watch -n 2 'ps aux --sort=-%cpu | head -11'

ネットワーク監視

# ネットワーク接続の監視
watch -n 1 'netstat -an | grep -c ESTABLISHED'

# 特定ポートの監視
watch -n 2 'lsof -i :80'

# ネットワークインターフェースの状態
watch -n 1 'ip -s link show'

# アクティブな接続の詳細
watch -n 2 'ss -tunap | grep ESTAB'

ファイルとディレクトリの監視

ファイルの変更監視

# ファイルサイズの監視
watch -n 1 'ls -lh /var/log/syslog'

# ログファイルの行数監視
watch -n 2 'wc -l /var/log/*.log'

# 最新のログエントリ
watch -n 1 'tail -5 /var/log/syslog'

# ディレクトリ内のファイル数
watch -n 2 'find /tmp -type f | wc -l'

ビルドプロセスの監視

# コンパイル状況の監視
watch -n 1 'ls -la *.o | wc -l'

# テスト実行状況
watch -n 2 'grep -c "PASS\|FAIL" test_results.log'

# ビルドディレクトリのサイズ
watch -n 5 'du -sh build/'

高度な使用方法

複雑なコマンドの実行

# パイプを含むコマンド(クォートが重要)
watch 'ps aux | grep python | wc -l'

# 複数コマンドの実行
watch 'date; echo "---"; df -h'

# 条件付き出力
watch 'if [ $(date +%S) -gt 30 ]; then echo "後半"; else echo "前半"; fi'

# シェル関数の利用
watch 'bash -c "function status() { echo Load: $(uptime | cut -d, -f4-); }; status"'

カラー出力の保持

# カラー出力を有効化(--color オプション)
watch --color 'ls --color=always -la'

# grepのカラー出力
watch --color 'grep --color=always "error" /var/log/syslog | tail -10'

# 複数のカラーコマンド
watch --color 'echo -e "\033[32mGreen\033[0m \033[31mRed\033[0m"'

エラー処理

# コマンドの終了ステータスを確認(-e オプション)
watch -e 'ping -c 1 google.com > /dev/null && echo "OK" || echo "NG"'

# エラー時に停止(-g オプション)
watch -g 'test -f /tmp/stop_watch && echo "File found!"'

# タイムアウトの設定
timeout 60 watch -n 1 'date'

実用的なスクリプト例

システムダッシュボード

#!/bin/bash
# システム状態ダッシュボード

watch -t -n 1 '
echo "=== System Dashboard - $(date) ==="
echo
echo "CPU Load: $(uptime | cut -d":" -f5)"
echo
echo "Memory Usage:"
free -h | grep -E "^Mem|^Swap"
echo
echo "Disk Usage:"
df -h | grep -E "^Filesystem|/$"
echo
echo "Top Processes:"
ps aux --sort=-%cpu | head -6
'

ログ監視スクリプト

#!/bin/bash
# エラーログ監視

LOG_FILE="/var/log/app.log"

watch -d -n 2 "
echo '=== Error Log Monitor ==='
echo
echo 'Last 5 errors:'
grep ERROR $LOG_FILE | tail -5
echo
echo 'Error count: $(grep -c ERROR $LOG_FILE)'
echo 'Warning count: $(grep -c WARN $LOG_FILE)'
"

デプロイメント監視

#!/bin/bash
# デプロイ状況の監視

watch -n 1 '
echo "Deployment Status"
echo "================"
echo
echo "Running containers:"
docker ps --format "table {{.Names}}\t{{.Status}}" | head -10
echo
echo "Latest logs:"
docker logs --tail 5 app-container 2>&1
'

🎮 理解度チェック

Q1: watchコマンドで実行間隔を指定するオプションは?

watchコマンドで実行間隔を指定するオプションは?

Q2: 前回の出力との差分をハイライト表示するオプションは?

watchで前回の出力との差分をハイライト表示するオプションは?

Q3: watchコマンドのデフォルトの更新間隔は?

watchコマンドのデフォルトの更新間隔は?

cronとの使い分け

watchとcronはどちらも定期実行を行いますが、用途が異なります。適切に使い分けましょう:

watchが適している場合

# リアルタイム監視が必要
watch -n 1 'tail -n 20 /var/log/syslog'

# 一時的な監視
watch -n 2 'ps aux | grep deployment'

# インタラクティブな確認
watch -d 'ls -la /tmp/'

cronが適している場合

# 定期的なバックアップ
# crontab -e
0 2 * * * /backup/script.sh

# ログローテーション
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf

# 定期レポート生成
0 9 * * 1 /reports/weekly_report.sh

💡 使い分けのポイント:

  • watch: 人が画面を見ながらリアルタイム監視
  • cron: バックグラウンドでの自動実行

トラブルシューティング

よくある問題と解決方法

# 画面がちらつく場合
# ターミナルサイズを調整
watch -n 1 'resize; your_command'

# 特殊文字が表示されない
# エスケープシーケンスを有効化
watch --color 'echo -e "\033[1mBold text\033[0m"'

# コマンドが見つからない
# フルパスを指定
watch -n 1 '/usr/bin/custom_command'

# 出力が切れる
# 画面サイズに合わせて調整
watch -n 1 'your_command | head -20'

パフォーマンスの考慮

# CPU負荷の高いコマンドは間隔を長く
watch -n 10 'find / -name "*.log" 2>/dev/null'

# 出力が多い場合は必要な部分だけ
watch -n 2 'ps aux | head -20'

# ネットワークを使うコマンドは控えめに
watch -n 30 'curl -s http://example.com/status'

ベストプラクティス

効果的な使い方

  1. 適切な間隔の設定: システムに負荷をかけない範囲で
  2. 出力の整形: 見やすい形式に加工
  3. 差分の活用: -dオプションで変化を把握
  4. エラー処理: -eや-gオプションで異常を検知

セキュリティの考慮

# パスワードを含むコマンドは避ける
# 悪い例
watch 'mysql -u root -ppassword -e "SHOW STATUS"'

# 良い例(設定ファイルを使用)
watch 'mysql --defaults-file=~/.my.cnf -e "SHOW STATUS"'

# ログファイルは適切な権限で
watch -n 5 'sudo tail -n 20 /var/log/secure'

📝 まとめ

今回はwatchコマンドについて学びました!

watchコマンドは、シンプルながらシステム管理や開発作業において非常に強力なツールでしたね。覚えておきたいポイントをまとめます:

  • デフォルトは2秒ごとにコマンドを実行
  • -nオプションで実行間隔を変更できる
  • -dオプションで変更部分をハイライト表示
  • パイプを含むコマンドはクォートで囲む
  • Ctrl+Cで終了
  • リアルタイム監視にはwatch、バックグラウンド実行にはcron

watchコマンドを使いこなせば、システム監視、ログ確認、プロセス管理、ファイル監視など、様々なタスクが効率的に行えるようになります。

次はtopコマンドで、より詳細なシステム監視方法を学んでみましょう!