Linuxで5秒ごとにコマンドを実行する方法|watchやwhileループで簡単監視

Linux

Linuxでサーバー管理やデバッグをしていると、「このコマンドを5秒ごとに繰り返し実行したい」と思う場面がよくあります。例えば:

  • ログの変化を定期的に確認したい
  • プロセス状況やメモリ使用量を監視したい
  • HTTPステータスを何度もチェックしたい
  • データベースの接続数を継続的に監視したい

こういったときに便利なのが、自動で一定間隔ごとにコマンドを実行する方法です。

この記事では、Linuxで5秒ごとにコマンドを繰り返し実行する方法を、watchwhileループを使ってわかりやすく解説します。

スポンサーリンク

watchコマンドで簡単リアルタイム監視

watchコマンドとは?

watchは指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に更新表示してくれるLinux標準のツールです。画面がリアルタイムで更新されるため、変化を目で追いやすいのが特徴です。

基本的な使い方

watch -n 5 コマンド

-n 5で5秒間隔を指定します。これで5秒ごとにコマンドを実行し、画面を更新してくれます。

実践的な使用例

5秒ごとにプロセス状況を確認

watch -n 5 "ps aux | grep nginx"

5秒ごとにディスク使用状況を監視

watch -n 5 "df -h"

5秒ごとにメモリ使用量をチェック

watch -n 5 "free -h"

5秒ごとにネットワーク接続を確認

watch -n 5 "netstat -tuln | grep :80"

watchの便利なオプション

変更箇所をハイライト表示

watch -d -n 5 "netstat -an"

-dオプションを使うと、前回の実行結果から変更があった部分を色付きで表示してくれます。

累積差分をハイライト

watch -d=cumulative -n 5 "ps aux --sort=-%cpu | head -10"

累積的に変更箇所をハイライトし続けるため、変化の履歴を追いやすくなります。

実行時間とタイトルを非表示

watch -t -n 5 "date"

-tオプションでヘッダー情報を非表示にし、コマンド結果のみを表示できます。

watchのメリットとデメリット

メリット

  • 一行で簡単に実行できる
  • リアルタイムで画面更新される
  • 変更箇所のハイライト機能が便利
  • 標準で多くのLinuxディストリビューションに含まれている

デメリット

  • 結果をファイルに保存できない
  • 複雑な条件分岐や処理ができない
  • バックグラウンド実行には向かない

whileループで柔軟な定期実行

基本的なwhileループの構文

bashで無限ループとsleepを組み合わせると、より柔軟に5秒間隔でコマンドを実行できます:

while true; do
    コマンド
    sleep 5
done

この方法なら、結果をログに保存したり、条件に応じて処理を変更したりできます。

実践的な使用例

5秒ごとにCPU負荷をログファイルに記録

while true; do
    echo "$(date): CPU負荷チェック" >> cpu.log
    top -b -n1 | head -5 >> cpu.log
    echo "---" >> cpu.log
    sleep 5
done

5秒ごとにWebサーバーの死活監視

while true; do
    if curl -s -o /dev/null -w "%{http_code}" https://example.com | grep -q "200"; then
        echo "$(date): サーバー正常"
    else
        echo "$(date): サーバーエラー" | tee -a error.log
    fi
    sleep 5
done

5秒ごとにディスク使用量を監視し、閾値を超えたら警告

while true; do
    USAGE=$(df / | awk 'NR==2{print $5}' | sed 's/%//')
    if [ $USAGE -gt 80 ]; then
        echo "$(date): 警告 - ディスク使用量が${USAGE}%です" | tee -a disk_alert.log
    fi
    sleep 5
done

バックグラウンド実行とプロセス管理

バックグラウンドで実行

while true; do
    date >> monitoring.log
    ps aux | grep apache >> monitoring.log
    sleep 5
done &

最後に&を付けることで、バックグラウンドで実行できます。

プロセスIDを記録して後で停止

# 実行時にプロセスIDを記録
while true; do
    監視コマンド
    sleep 5
done & echo $! > monitor.pid

# 停止時
kill $(cat monitor.pid)
rm monitor.pid

エラーハンドリングと再試行機能

コマンド失敗時の処理

while true; do
    if ! ping -c 1 google.com > /dev/null 2>&1; then
        echo "$(date): ネットワーク接続エラー" >> network.log
    else
        echo "$(date): ネットワーク正常" >> network.log
    fi
    sleep 5
done

再試行機能付きの監視

while true; do
    for i in {1..3}; do
        if curl -s https://api.example.com/health > /dev/null; then
            echo "$(date): API正常応答"
            break
        else
            echo "$(date): API応答なし (試行 $i/3)"
            [ $i -eq 3 ] && echo "$(date): API完全停止" >> critical.log
        fi
        sleep 2
    done
    sleep 5
done

cronとの使い分け

短時間間隔での実行比較

5秒間隔の場合

  • watch/whileループ:適している
  • cron:最小間隔が1分のため不向き

分単位での定期実行

  • cron:システム管理しやすく適している
  • whileループ:メモリを常時使用するため非効率

実際の使い分けガイド

watchを使う場面

  • リアルタイム監視が必要
  • 一時的な調査や確認作業
  • 変化を目で追いたい場合

whileループを使う場面

  • 結果をログに保存したい
  • 条件分岐や複雑な処理が必要
  • バックグラウンド実行したい

cronを使う場面

  • 長期間の定期実行
  • システム起動時から自動実行
  • 分単位以上の間隔での実行

高度な活用テクニック

複数コマンドの同時監視

複数のメトリクスを一度に表示

watch -n 5 '
echo "=== CPU使用率 ==="
top -b -n1 | head -5
echo ""
echo "=== メモリ使用量 ==="
free -h
echo ""
echo "=== ディスク使用量 ==="
df -h /
'

条件付き実行とアラート機能

負荷が高いときのみ詳細ログを記録

while true; do
    LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
    if (( $(echo "$LOAD > 2.0" | bc -l) )); then
        echo "$(date): 高負荷検出 - Load: $LOAD" >> high_load.log
        ps aux --sort=-%cpu | head -10 >> high_load.log
        echo "---" >> high_load.log
    fi
    sleep 5
done

監視結果のグラフ化準備

CSV形式でのデータ収集

echo "timestamp,cpu_usage,memory_usage,disk_usage" > system_metrics.csv
while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    CPU=$(top -b -n1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
    MEMORY=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
    DISK=$(df / | awk 'NR==2{print $5}' | sed 's/%//')
    echo "$TIMESTAMP,$CPU,$MEMORY,$DISK" >> system_metrics.csv
    sleep 5
done

トラブルシューティング

よくある問題と解決方法

watchでパイプラインが動作しない

# 悪い例
watch -n 5 ps aux | grep nginx

# 良い例(クォートで囲む)
watch -n 5 "ps aux | grep nginx"

whileループが停止しない

# Ctrl+C で停止、またはプロセスIDで停止
ps aux | grep "while true"
kill プロセスID

メモリ使用量が増え続ける

# ログファイルのローテーション例
while true; do
    if [ $(wc -l < monitoring.log) -gt 1000 ]; then
        mv monitoring.log monitoring.log.$(date +%Y%m%d_%H%M%S)
        touch monitoring.log
    fi
    echo "$(date): 監視データ" >> monitoring.log
    sleep 5
done

まとめ

Linuxで5秒ごとにコマンドを実行する方法は、用途に応じて使い分けることが重要です:

watchコマンドの特徴

  • リアルタイム画面更新で変化を追いやすい
  • 一行で簡単に実行できる
  • 変更箇所のハイライト機能が便利
  • 一時的な監視や調査に最適

whileループの特徴

  • 結果をログファイルに保存可能
  • 条件分岐や複雑な処理に対応
  • バックグラウンド実行が可能
  • 長期間の自動監視に適している

コメント

タイトルとURLをコピーしました