見出し画像

【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
  1. function send_alert(): アラートを送信する関数。引数にアラートタイプ($1)とメモリ使用率($2)を受け取る

  2. local type=$1: アラートタイプをローカル変数typeに代入。

  3. local usage=$2: メモリ使用率をローカル変数usageに代入。

  4. local message="...": 日時、アラートタイプ、メモリ使用率を含むメッセージを作成し、ローカル変数messageに代入。

  5. case $type in ... esac: アラートタイプに応じて通知方法を選択。

    • email: mail コマンドを使ってメールでアラートを送信。

    • slack: curl コマンドを使ってSlackにアラートを送信。

    • log: メッセージを /var/log/memory_usage_check.log に追記。

  6. 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
  1. unction check_service_status(): サービスのステータスを確認するための関数。引数としてサービス名($1)を受け取り、systemctl is-active --quiet コマンドを使ってサービスがアクティブかどうかをチェックし、結果を返す。

  2. function send_alert_email(): アラートをメールで送信するための関数。引数としてサービスのステータス($1)を受け取る。この関数内で、日時、サービス名、ステータスを含むメッセージを作成し、mail コマンドを使ってメールを送信する。

  3. function send_alert_slack(): アラートをSlackで送信するための関数。引数としてサービスのステータス($1)を受け取る。この関数内で、日時、サービス名、ステータスを含むメッセージを作成し、curl コマンドを使ってSlackに通知を送る。

  4. function send_alert_log(): アラートをログファイルに記録するための関数。引数としてサービスのステータス($1)を受け取る。この関数内で、日時、サービス名、ステータスを含むメッセージを作成し、/var/log/service_status_check.log に追記する。

  5. if [ $service_status -ne 0 ]; then ... fi: サービスがアクティブでない場合、send_alert_emailsend_alert_slacksend_alert_log 関数を使って各種通知を行う。






















よろしければサポートお願いします!よりいい情報を発信します。