【Linux】 システム監視スクリプト
CPU使用率監視
#!/bin/bash
THRESHOLD=80
INTERVAL=60
LOGFILE="/var/log/cpu_usage_check.log"
while true; do
CPU_USAGE=$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}')
CPU_USAGE_INT=${CPU_USAGE%.*}
if [ $CPU_USAGE_INT -gt $THRESHOLD ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - CPU usage: $CPU_USAGE_INT%, Threshold: $THRESHOLD%" >> $LOGFILE
fi
sleep $INTERVAL
done
THRESHOLD=80: CPU使用率のしきい値を80%に設定
INTERVAL=60: 監視の間隔を60秒に設定
LOGFILE="/var/log/cpu_usage_check.log": アラートを出力するログファイルを指定
CPU_USAGE=$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'): topコマンドからCPU使用率を取得し、CPU_USAGE変数に格納
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S'): タイムスタンプを作成
echo "$TIMESTAMP - CPU usage: $CPU_USAGE_INT%, Threshold: $THRESHOLD%" >> $LOGFILE: アラートをログファイルに出力
メモリ使用率監視
#!/bin/bash
THRESHOLD=90
INTERVAL=60
LOGFILE="/var/log/memory_usage_check.log"
while true; do
TOTAL_MEMORY=$(free | grep Mem | awk '{print $2}')
USED_MEMORY=$(free | grep Mem | awk '{print $3}')
MEMORY_USAGE=$(echo "scale=2; $USED_MEMORY/$TOTAL_MEMORY*100" | bc)
MEMORY_USAGE_INT=${MEMORY_USAGE%.*}
if [ $MEMORY_USAGE_INT -gt $THRESHOLD ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - Memory usage: $MEMORY_USAGE_INT%, Threshold: $THRESHOLD%" >> $LOGFILE
fi
sleep $INTERVAL
done
THRESHOLD=90: メモリ使用率のしきい値を90%に設定
OTAL_MEMORY=$(free | grep Mem | awk '{print $2}'): freeコマンドから合計メモリ量を取得し、TOTAL_MEMORY変数に格納
USED_MEMORY=$(free | grep Mem | awk '{print $3}'): freeコマンドから使用中のメモリ量を取得し、USED_MEMORY変数に格納
MEMORY_USAGE=$(echo "scale=2; $USED_MEMORY/$TOTAL_MEMORY*100" | bc): 使用中のメモリ量と合計メモリ量からメモリ使用率を計算し、MEMORY_USAGE変数に格納
中〜上級
#!/bin/bash
THRESHOLD=80
function send_alert() {
local type=$1
local usage=$2
local message="[$(date '+%Y-%m-%d %H:%M:%S')] - Alert type: $type, Memory usage: $usage%"
case $type in
email)
echo "$message" | mail -s "Memory usage alert" user@example.com
;;
slack)
curl -X POST -H 'Content-type: application/json' --data "{'text':'$message'}" https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZ
;;
log)
echo "$message" >> /var/log/memory_usage_check.log
;;
esac
}
while true; do
MEMORY_USAGE=$(free -m | awk 'NR==2{printf "%.0f", $3*100/$2}')
if [ $MEMORY_USAGE -gt $THRESHOLD ]; then
send_alert "email" $MEMORY_USAGE
send_alert "slack" $MEMORY_USAGE
send_alert "log" $MEMORY_USAGE
fi
sleep 60
done
function send_alert(): アラートを送信する関数。引数にアラートタイプ($1)とメモリ使用率($2)を受け取る
local type=$1: アラートタイプをローカル変数typeに代入。
local usage=$2: メモリ使用率をローカル変数usageに代入。
local message="...": 日時、アラートタイプ、メモリ使用率を含むメッセージを作成し、ローカル変数messageに代入。
case $type in ... esac: アラートタイプに応じて通知方法を選択。
email: mail コマンドを使ってメールでアラートを送信。
slack: curl コマンドを使ってSlackにアラートを送信。
log: メッセージを /var/log/memory_usage_check.log に追記。
if [ $MEMORY_USAGE -gt $THRESHOLD ]; then ... fi: メモリ使用率が閾値($THRESHOLD)を超えた場合、send_alert 関数を使って各種通知を行う。
スワップ使用率監視
#!/bin/bash
THRESHOLD=50
INTERVAL=60
function check_swap_usage() {
local swap_usage=$(free -m | awk 'NR==3{printf "%.0f", $3*100/$2}')
if [ $swap_usage -gt $THRESHOLD ]; then
echo $swap_usage
else
echo 0
fi
}
function send_alert_email() {
local usage=$1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - Swap usage: $usage%" | mail -s "Swap usage alert" user@example.com
}
function send_alert_slack() {
local usage=$1
local message="[$(date '+%Y-%m-%d %H:%M:%S')] - Swap usage: $usage%"
curl -X POST -H 'Content-type: application/json' --data "{'text':'$message'}" https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZ
}
function send_alert_log() {
local usage=$1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - Swap usage: $usage%" >> /var/log/swap_usage_check.log
}
while true; do
swap_usage=$(check_swap_usage)
if [ $swap_usage -gt 0 ]; then
send_alert_email $swap_usage
send_alert_slack $swap_usage
send_alert_log $swap_usage
fi
sleep $INTERVAL
done
ディスク使用率監視
#!/bin/bash
THRESHOLD=90
INTERVAL=60
LOGFILE="/var/log/disk_usage_check.log"
while true; do
DISK_USAGE=$(df --output=pcent / | tail -1 | tr -dc '0-9')
if [ $DISK_USAGE -gt $THRESHOLD ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - Disk usage: $DISK_USAGE%, Threshold: $THRESHOLD%" >> $LOGFILE
fi
sleep $INTERVAL
done
THRESHOLD=90: ディスク使用率のしきい値を90%に設定
INTERVAL=60: 監視の間隔を60秒に設定
DISK_USAGE=$(df --output=pcent / | tail -1 | tr -dc '0-9'): dfコマンドからディスク使用率を取得し、DISK_USAGE変数に格納
プロセス監視
#!/bin/bash
PROCESS_NAME="httpd"
INTERVAL=60
LOGFILE="/var/log/process_check.log"
while true; do
PROCESS_COUNT=$(pgrep -c $PROCESS_NAME)
if [ $PROCESS_COUNT -eq 0 ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - Process '$PROCESS_NAME' not running" >> $LOGFILE
fi
sleep $INTERVAL
done
LOGFILE="/var/log/process_check.log": アラートを出力するログファイルを指定
while true; do ... done: 無限ループでスクリプトを実行
PROCESS_COUNT=$(pgrep -c $PROCESS_NAME): pgrepコマンドでプロセスの数を取得し、PROCESS_COUNT変数に格納
ネットワーク接続数監視
#!/bin/bash
THRESHOLD=100
INTERVAL=60
LOGFILE="/var/log/network_connections_check.log"
while true; do
CONNECTION_COUNT=$(netstat -n | grep -c "ESTABLISHED")
if [ $CONNECTION_COUNT -gt $THRESHOLD ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - Network connections: $CONNECTION_COUNT, Threshold: $THRESHOLD" >> $LOGFILE
fi
sleep $INTERVAL
done
CONNECTION_COUNT=$(netstat -n | grep -c "ESTABLISHED"): netstatコマンドでネットワーク接続数を取得し、CONNECTION_COUNT変数に格納
if [ $CONNECTION_COUNT -gt $THRESHOLD ]; then ... fi: ネットワーク接続数がしきい値を超えた場合の処理
echo "$TIMESTAMP - Network connections: $CONNECTION_COUNT, Threshold: $THRESHOLD" >> $LOGFILE: アラートをログファイルに出力
MySQLデータベース監視
#!/bin/bash
MYSQL_USER="user"
MYSQL_PASSWORD="password"
INTERVAL=60
LOGFILE="/var/log/mysql_database_check.log"
while true; do
DB_STATUS=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" 2>&1)
if [[ $DB_STATUS == *"ERROR"* ]]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - MySQL database error: $DB_STATUS" >> $LOGFILE
fi
sleep $INTERVAL
done
MYSQL_USER="user": MySQLユーザー名を設定
MYSQL_PASSWORD="password": MySQLパスワードを設定
INTERVAL=60: 監視の間隔を60秒に設定
DB_STATUS=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" 2>&1): mysqlコマンドでデータベースの状態を取得し、DB_STATUS変数に格納
Webサーバーアクセスログ監視
#!/bin/bash
LOGFILE="/var/log/httpd/access.log"
ALERTLOG="/var/log/webserver_access_check.log"
INTERVAL=60
ERROR_THRESHOLD=10
while true; do
TIMESTAMP_START=$(date -d "-$INTERVAL seconds" '+%Y-%m-%d %H:%M:%S')
TIMESTAMP_END=$(date '+%Y-%m-%d %H:%M:%S')
ERROR_COUNT=$(awk -v start="$TIMESTAMP_START" -v end="$TIMESTAMP_END" '$4>"["start" " && $4<="["end" " && $9 >= 400 {count++} END {print count}' $LOGFILE)
if [ $ERROR_COUNT -ge $ERROR_THRESHOLD ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - Web server error count: $ERROR_COUNT, Threshold: $ERROR_THRESHOLD" >> $ALERTLOG
fi
sleep $INTERVAL
done
LOGFILE="/var/log/httpd/access.log": 監視対象のアクセスログファイルを指定
ALERTLOG="/var/log/webserver_access_check.log": アラートを出力するログファイルを指定
INTERVAL=60: 監視の間隔を60秒に設定
ERROR_THRESHOLD=10: エラーのしきい値を10に設定
ERROR_COUNT=$(awk -v start="$TIMESTAMP_START" -v end="$TIMESTAMP_END" '$4>"["start" " && $4<="["end" " && $9 >= 400 {count++} END {print count}' $LOGFILE): エラーカウントを取得し、ERROR_COUNT変数に格納
echo "$TIMESTAMP - Web server error count: $ERROR_COUNT, Threshold: $ERROR_THRESHOLD" >> $ALERTLOG: アラートをログファイルに出力
サービスの稼働状況監視
#!/bin/bash
SERVICE_NAME="nginx"
INTERVAL=60
function check_service_status() {
systemctl is-active --quiet $1
echo $?
}
function send_alert_email() {
local status=$1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - Service '$SERVICE_NAME' status: $status" | mail -s "Service status alert" user@example.com
}
function send_alert_slack() {
local status=$1
local message="[$(date '+%Y-%m-%d %H:%M:%S')] - Service '$SERVICE_NAME' status: $status"
curl -X POST -H 'Content-type: application/json' --data "{'text':'$message'}" https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZ
}
function send_alert_log() {
local status=$1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - Service '$SERVICE_NAME' status: $status" >> /var/log/service_status_check.log
}
while true; do
service_status=$(check_service_status $SERVICE_NAME)
if [ $service_status -ne 0 ]; then
send_alert_email "inactive"
send_alert
unction check_service_status(): サービスのステータスを確認するための関数。引数としてサービス名($1)を受け取り、systemctl is-active --quiet コマンドを使ってサービスがアクティブかどうかをチェックし、結果を返す。
function send_alert_email(): アラートをメールで送信するための関数。引数としてサービスのステータス($1)を受け取る。この関数内で、日時、サービス名、ステータスを含むメッセージを作成し、mail コマンドを使ってメールを送信する。
function send_alert_slack(): アラートをSlackで送信するための関数。引数としてサービスのステータス($1)を受け取る。この関数内で、日時、サービス名、ステータスを含むメッセージを作成し、curl コマンドを使ってSlackに通知を送る。
function send_alert_log(): アラートをログファイルに記録するための関数。引数としてサービスのステータス($1)を受け取る。この関数内で、日時、サービス名、ステータスを含むメッセージを作成し、/var/log/service_status_check.log に追記する。
if [ $service_status -ne 0 ]; then ... fi: サービスがアクティブでない場合、send_alert_email、send_alert_slack、send_alert_log 関数を使って各種通知を行う。
よろしければサポートお願いします!よりいい情報を発信します。