리눅스 디스크 용량 알림 메일 발송

Dev Smile·2024년 10월 20일
1

Azure 기능을 이용하여 간단하게 모니터링을 할 수도 있습니다만, 작게나마 비용이 발생하여 리눅스 명령어를 이용하여 체크하는 방법을 조사해보았습니다.

Azure 기능 이용 방법

1. 개요

작성할 방식으로 다음과 같은 기능을 구현하였습니다.

  • 지정된 파티션의 디스크 사용량 모니터링
  • 사용량이 임계값을 초과할 경우 경고 이메일 발송
  • 과도한 알림 방지를 위한 알림 간격 설정

2. 설치 및 설정

2.1 msmtp 설치

sudo apt-get update
sudo apt-get install msmtp msmtp-mta

2.2 msmtp 설정

/etc/msmtprc 또는 ~/.msmtprc 파일을 생성하고 다음 내용을 입력합니다:

# 기본 설정

defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

# Gmail 계정 설정 (예시)

account        gmail
host           smtp.gmail.com
port           587
from           my_account@domain.com
user           my_account@domain.com
password       my gmail app password  # Gmail 앱 비밀번호


# 기본 계정 설정
account default : gmail

설정 파일의 권한을 설정합니다:

chmod 600 /etc/msmtprc   # 또는 ~/.msmtprc

테스트 메일을 보내봅니다.

echo -e "Subject: mail test \n\nhello" | sendmail my_account@domain.com

2.3 모니터링 스크립트 설정

/etc/disk_monitor_config.sh 파일을 생성하고 다음 내용을 입력합니다:

# 모니터링할 파티션
PARTITION="/dev/root"

# 경고를 발생시킬 디스크 사용량 임계값 (백분율)
THRESHOLD=90

# 알림 로그 파일 위치
ALERT_LOG="/var/log/disk_alert_log.txt"

# 알림 간격 (초 단위, 기본값: 1시간)
ALERT_INTERVAL=3600

# 경고 이메일을 받을 주소 (여러명 발송 시 공백없이 ","로 구분)
EMAIL="your-email@example.com"

# 보내는 사람 이메일 주소
MAIL_FROM="your-email@gmail.com"

2.4 모니터링 스크립트

다음 내용으로 disk_monitor.sh 파일을 생성합니다:

#!/bin/bash

# 설정 파일 로드
CONFIG_FILE="/etc/disk_monitor_config.sh"
if [[ -f "$CONFIG_FILE" ]]; then
    source "$CONFIG_FILE"
else
    echo "설정 파일을 찾을 수 없습니다: $CONFIG_FILE"
    exit 1
fi

# 기본 설정값 (설정 파일에서 정의되지 않은 경우 사용)
PARTITION=${PARTITION:-"/dev/root"}
THRESHOLD=${THRESHOLD:-90}
ALERT_LOG=${ALERT_LOG:-"/var/log/disk_alert_log.txt"}
ALERT_INTERVAL=${ALERT_INTERVAL:-3600}
EMAIL=${EMAIL:-"your-email@example.com"}
MAIL_FROM=${MAIL_FROM:-"server@example.com"}

# 현재 시간 가져오기
current_time=$(date +%s)

# 파티션 사용량 확인
usage=$(LANG=C df -h | grep "$PARTITION" | awk '{print $5}' | sed 's/%//')

if [[ ! "$usage" =~ ^[0-9]+$ ]]; then
    echo "오류: 디스크 사용량을 가져올 수 없습니다." >&2
    exit 1
fi

# 마지막 알림 시간을 파일에서 읽기
if [[ -f "$ALERT_LOG" ]]; then
    last_alert_time=$(cat "$ALERT_LOG")
    if [[ ! "$last_alert_time" =~ ^[0-9]+$ ]]; then
        echo "오류: 알림 로그 파일의 형식이 잘못되었습니다." >&2
        exit 1
    fi
else
    last_alert_time=0
fi

# 사용량이 임계치를 초과하고, 알림 간격이 지났는지 확인
if [[ "$usage" -gt "$THRESHOLD" ]] && [[ $((current_time - last_alert_time)) -ge $ALERT_INTERVAL ]]; then
    # 이메일 내용 생성
    subject="디스크 공간 경고"
    body="경고: $PARTITION 파티션이 ${usage}% 찼습니다."

    # msmtp를 사용하여 이메일 전송
    if ! echo -e "To: $EMAIL\nSubject: $subject\n\n$body" | msmtp -a default "$EMAIL"; then
        echo "오류: 이메일 전송에 실패했습니다." >&2
        exit 1
    fi

    # 현재 시간을 알림 기록 파일에 저장
    if ! echo "$current_time" > "$ALERT_LOG"; then
        echo "오류: 알림 로그 파일에 쓰기 실패했습니다." >&2
        exit 1
    fi

    echo "경고 이메일을 보냈습니다."
else
    echo "현재 디스크 사용량은 ${usage}%입니다. 경고 기준($THRESHOLD%)을 초과하지 않았거나 알림 간격이 지나지 않았습니다."
fi

스크립트에 실행 권한을 부여합니다:

chmod +x /path/to/disk_monitor.sh

3. 사용 방법

3.1 수동 실행

스크립트를 수동으로 실행하려면:

/path/to/disk_monitor.sh
  • 테스트 (현재 용량 : 75%, 설정 용량 74%)

3.2 자동 실행 설정 (cron)

crontab을 편집합니다:

crontab -e

다음 줄을 추가하여 매 시간 스크립트를 실행하도록 설정합니다:

0 * * * * /path/to/disk_monitor.sh
  • 테스트 (현재 용량 : 75%, 설정 용량 74%)

0개의 댓글

관련 채용 정보