Linuxでサーバー管理やデバッグをしていると、「このコマンドを5秒ごとに繰り返し実行したい」と思う場面がよくあります。例えば:
- ログの変化を定期的に確認したい
- プロセス状況やメモリ使用量を監視したい
- HTTPステータスを何度もチェックしたい
- データベースの接続数を継続的に監視したい
こういったときに便利なのが、自動で一定間隔ごとにコマンドを実行する方法です。
この記事では、Linuxで5秒ごとにコマンドを繰り返し実行する方法を、watch
やwhile
ループを使ってわかりやすく解説します。
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
ループの特徴
- 結果をログファイルに保存可能
- 条件分岐や複雑な処理に対応
- バックグラウンド実行が可能
- 長期間の自動監視に適している
コメント