シェルスクリプトでサーバー監視を自動化

※本記事はプロモーションを含みます。
シェルスクリプトを活用することで、サーバーのCPU・メモリ・ディスク使用率をリアルタイム監視し、問題の早期発見と自動対応が可能になるとされています。本記事では、ネットワークエンジニア向けに、実務で使える監視スクリプトの実装方法を解説します。読了時間の目安は5分です。
目次
シェルスクリプト監視が必要な理由
サーバーの安定稼働には、システムリソースの状態を常時把握することが重要とされています。手作業での定期確認は人的負担が大きく、特に複数のサーバーを管理する場合は監視漏れが生じる可能性があります。
シェルスクリプトによる自動監視には、以下の利点があるとされています。
- 24時間体制の監視:手作業に頼らず、継続的にリソース状態を確認できます。
- コスト削減:追加のエージェントソフトウェアをインストールせず、汎用的なシェルコマンドで実現可能です。
- カスタマイズ性の高さ:組織固有のルール(警告閾値、通知先など)に対応できます。
- 迅速な問題対応:異常検知時に即座にアラートを送信し、管理者の素早い対応が可能になります。
- ログ記録:監視履歴をファイルとして保持し、後々のトラブルシューティングに活用できます。
特に Linux サーバーの運用では、追加ライセンス不要で実装できるため、中小規模の環境では有効な手段とされています。
監視スクリプトの基本構造
シェルスクリプトによる監視の基本は、システムコマンドで情報を取得し、その結果を判定して、必要に応じて通知を行うという流れとなります。
スクリプトの基本形
以下のような構造が標準的とされています。
| 要素 | 役割 |
|---|---|
#!/bin/bash | シェバングの宣言 |
| 変数定義 | ホスト名、メールアドレス、閾値などを指定 |
| 関数定義 | チェック処理、通知処理などを関数化 |
| メイン処理 | 各チェック関数を実行し、結果を集計 |
| ログ出力 | 実行結果をファイルに記録 |
最小限のテンプレート例
以下のような基本形から出発するのが実装の第一歩とされています。
#!/bin/bash
変数定義
HOSTNAME=$(hostname)
LOGFILE="/var/log/server_monitor.log"
MAIL_TO="admin@example.com"
ALERT_THRESHOLD=80
ログ出力関数
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
メール送信関数
send_alert() {
echo "$1" | mail -s "Alert: $HOSTNAME" $MAIL_TO
log_message "Alert sent: $1"
}
CPU使用率チェック
check_cpu() {
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print int($2)}')
log_message "CPU Usage: ${CPU}%"
if [ $CPU -gt $ALERT_THRESHOLD ]; then
send_alert "CPU usage is ${CPU}% on $HOSTNAME"
fi
}
メイン処理
log_message "--- Monitoring Start ---"
check_cpu
log_message "--- Monitoring End ---"
このテンプレートに関数を追加していく形で、監視スクリプトを拡張していくことになります。
リソース監視の実装方法
メモリ使用率の監視
メモリ不足はアプリケーションのクラッシュやスワップの増加につながるため、継続的な監視が重要とされています。
check_memory() {
TOTAL=$(free | grep Mem | awk '{print $2}')
USED=$(free | grep Mem | awk '{print $3}')
PERCENT=$((USED * 100 / TOTAL))
log_message "Memory Usage: ${PERCENT}% (${USED}MB / ${TOTAL}MB)"
if [ $PERCENT -gt $ALERT_THRESHOLD ]; then
send_alert "Memory usage is ${PERCENT}% on $HOSTNAME"
fi
}
freeコマンドの出力をawkで抽出し、パーセンテージを計算する方法が一般的とされています。
ディスク使用量の確認
ファイルシステムの満杯は、ログファイルの書き込み失敗やアプリケーションエラーの原因となる可能性があります。
check_disk() {
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line; do
USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
MOUNT=$(echo $line | awk '{print $NF}')
log_message "Disk Usage: ${MOUNT} ${USAGE}%"
if [ $USAGE -gt $ALERT_THRESHOLD ]; then
send_alert "Disk ${MOUNT} usage is ${USAGE}% on $HOSTNAME"
fi
done
}
複数のマウントポイントをループ処理することで、ファイルシステム全体を一括監視できます。
プロセス監視
特定のサービス(ウェブサーバー、データベースなど)が停止していないか確認することは、サービス継続性の観点から重要とされています。
check_process() {
PROCESS_NAME="$1"
if pgrep -x "$PROCESS_NAME" > /dev/null; then
log_message "Process $PROCESS_NAME is running"
else
send_alert "Process $PROCESS_NAME is not running on $HOSTNAME"
fi
}
メイン処理で呼び出し
check_process "nginx"
check_process "mysqld"
pgrepコマンドを使うことで、プロセス名の存在確認が簡潔に実装できます。
ログ監視と通知機能
エラーログの監視
アプリケーションログの特定エラーを追跡することで、問題の兆候を早期発見できる可能性があります。
check_error_log() {
LOG_FILE="/var/log/application.log"
ERROR_COUNT=$(grep -c "ERROR" $LOG_FILE 2>/dev/null || echo 0)
RECENT_ERRORS=$(grep "ERROR" $LOG_FILE 2>/dev/null | tail -5)
if [ $ERROR_COUNT -gt 10 ]; then
log_message "Error count: $ERROR_COUNT"
send_alert "Detected $ERROR_COUNT errors in application log"
fi
}
メール通知の実装
監視スクリプトが異常を検知した際、管理者に即座に通知することで、対応時間を短縮できるとされています。メール通知の実装方法を示します。
- sendmailの場合:
echo "body" | sendmail recipient@example.com - postfixの場合:
echo "body" | mail -s "subject" recipient@example.com - 外部メールサービスの場合:ssmtpなどの設定が必要になる可能性があります
本番環境では、メール送信の失敗や遅延も想定し、送信結果をログに記録することが推奨されています。
スラック連携による通知
チーム規模が大きい環境では、スラックなどのメッセージングプラットフォームへの通知が有効とされています。
send_slack_alert() {
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
MESSAGE="$1"
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$MESSAGE\"}" \
$WEBHOOK_URL
}
ウェブフックURLを事前に取得し、curlで POST リクエストを送信する方法が一般的とされています。
自動実行スケジュール設定
cronの設定方法
シェルスクリプトを定期的に実行するには、cronを使うのが標準的とされています。
# crontabを編集
crontab -e
5分ごとに監視スクリプトを実行する設定例
*/5 * * * * /usr/local/bin/server_monitor.sh
毎日午前3時にレポートを生成
0 3 * * * /usr/local/bin/generate_report.sh
平日の営業時間内(午前9時~午後6時)は1分ごと
*/1 9-17 * * 1-5 /usr/local/bin/server_monitor.sh
crontabの時刻指定は、左から「分」「時」「日」「月」「曜日」の順で、スペース区切りとなります。
スクリプト実行権限の設定
cronが正常に実行されるためには、スクリプトに実行権限が必要とされています。
# 実行権限の付与
chmod +x /usr/local/bin/server_monitor.sh
所有者の変更(rootで実行する必要がある場合)
sudo chown root:root /usr/local/bin/server_monitor.sh
sudo chmod 755 /usr/local/bin/server_monitor.sh
セキュリティの観点から、スクリプトが不要なユーザーによって編集されないよう、ファイルパーミッションの設定が重要とされています。
実行ログの確認
cronが正常に実行されているかを確認するには、以下の方法があるとされています。
- syslogの確認:
grep CRON /var/log/syslog - ジャーナルの確認:
journalctl -u cron - メールの確認:cronは標準出力をメールで送信するため、ローカルメールを確認
継続的な監視を行うためには、cronの実行ログの定期的なチェックが推奨されています。
記事のまとめ
シェルスクリプトによるサーバー監視自動化は、比較的低コストで実装でき、カスタマイズ性が高い手法とされています。
本記事では、以下の内容を解説しました。
- シェルスクリプト監視導入の利点と必要性
- 監視スクリプトの基本構造とテンプレート
- CPU・メモリ・ディスク・プロセス監視の実装方法
- ログ監視やメール・スラック連携による通知機能
- cronを使った自動実行スケジュール設定
実装段階では、監視閾値の適切な設定や通知先の確認、テスト環境での十分な検証が重要とされています。また、スクリプトは定期的に見直し、サーバー環境やビジネス要件の変化に応じて更新する必要があるとされています。
本記事の内容を出発点として、組織固有の監視ルールを構築することで、より堅牢なサーバー運用基盤が実現できる可能性があります。
免責事項
本記事の情報は執筆時点のものです。シェルスクリプトの動作はシステム環境やシェルのバージョンにより異なる可能性があります。本番環境への適用前に、必ずテスト環境で十分に検証し、公式ドキュメント(例:manコマンド、各ディストリビューションのドキュメント)をご確認ください。セキュリティ設定やシステム管理に関する判断は、必ず専門家または公式情報に基づいて行ってください。




