Azure 기능을 이용하여 간단하게 모니터링을 할 수도 있습니다만, 작게나마 비용이 발생하여 리눅스 명령어를 이용하여 체크하는 방법을 조사해보았습니다.
Azure 기능 이용 방법
작성할 방식으로 다음과 같은 기능을 구현하였습니다.
sudo apt-get update
sudo apt-get install msmtp msmtp-mta
/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
스크립트를 수동으로 실행하려면:
/path/to/disk_monitor.sh
crontab을 편집합니다:
crontab -e
다음 줄을 추가하여 매 시간 스크립트를 실행하도록 설정합니다:
0 * * * * /path/to/disk_monitor.sh