본문 바로가기

리눅스 서버 특정 폴더와 파일 크기변화 모니터링 통한 파티션 용량 관리

특정 파티션(/home)의 용량이 계속 증가하는 원인을 찾기 위해 특정 폴더나 파일의 크기 변화를 모니터링하는 방법입니다.

1. du 명령어를 사용하여 용량 확인

/home 디렉토리 내의 폴더 및 파일 용량을 확인하기 위해 du 명령어를 사용할 수 있습니다.

du -sh /home/*

이 명령어는 /home 디렉토리 아래 각 서브디렉토리 및 파일의 크기를 요약하여 표시합니다.

2. 증가하는 파일 및 폴더 모니터링

특정 시간 간격으로 /home 디렉토리의 크기를 기록하고 비교하여 어떤 디렉토리 또는 파일이 급격하게 증가하는지 확인할 수 있습니다. 이를 위해 watch 명령어나 cron을 사용할 수 있습니다.

2-1. watch 명령어를 사용하는 방법

watch 명령어를 사용하여 10초 간격으로 /home 디렉토리의 크기를 모니터링할 수 있습니다.

watch -n 10 'du -sh /home/*'

2-2. cron을 사용하여 주기적으로 기록하는 방법

cron을 설정하여 1시간 간격으로 /home 디렉토리의 크기를 기록하는 스크립트를 만들 수 있습니다.

예를 들어, /home/usage_monitor.sh라는 스크립트를 만들어 다음 내용을 추가합니다.

#!/bin/bash
du -sh /home/* >> /home/usage_report.txt

이후 cron에 스크립트를 등록합니다.

crontab -e

다음 줄을 추가하여 1시간마다 실행되도록 설정합니다.

0 * * * * /bin/bash /home/usage_monitor.sh

이렇게 하면 /home/usage_report.txt 파일에 시간이 지남에 따라 증가하는 폴더나 파일의 크기를 확인할 수 있습니다.

3. 로그 파일 또는 캐시 파일 확인

종종 /home 파티션에서 용량이 급격하게 증가하는 원인은 로그 파일이나 애플리케이션의 캐시 파일 때문일 수 있습니다. 아래 명령어를 사용하여 특정 기간 동안 생성된 대형 파일을 찾을 수 있습니다.

find /home -type f -size +100M -exec ls -lh {} \;

이 명령어는 /home 디렉토리 내에서 100MB 이상의 파일을 찾아서 리스트로 보여줍니다.

4. 파일 시스템 모니터링 도구 사용

보다 정밀한 모니터링이 필요하다면, inotify-tools를 사용하여 파일 시스템 변경을 실시간으로 감시할 수 있습니다.

sudo apt-get install inotify-tools  # 설치
inotifywait -m -r -e create,delete,modify,move /home

이 명령어는 /home 디렉토리 내에서 파일이 생성되거나 삭제되거나 수정될 때마다 이를 출력합니다. 위 방법들을 통해 /home 파티션의 용량 증가 원인을 효과적으로 모니터링하고 관리할 수 있습니다.

 

디렉토리나 파일의 증가량을 효과적으로 모니터링하고 가시화하기 위해 다음과 같은 방식을 사용할 수 있습니다. 이 방법은 데이터를 데이터베이스에 수집하고, 특정 기간 동안 증가폭이 높은 파일 및 디렉토리를 분석한 후, 이를 슬랙에 자동으로 보고하는 시스템을 구축하는 방법입니다.

1. 파일 및 디렉토리 크기 수집 스크립트

/home 디렉토리의 파일 및 디렉토리 크기를 정기적으로 수집하여 데이터베이스에 저장하는 스크립트를 작성합니다.

1-1. Python 스크립트 작성

import os
import sqlite3
from datetime import datetime

# 데이터베이스 연결
conn = sqlite3.connect('/home/size_monitor.db')
cursor = conn.cursor()

# 테이블 생성 (존재하지 않는 경우)
cursor.execute('''
CREATE TABLE IF NOT EXISTS size_data (
    path TEXT,
    size INTEGER,
    timestamp DATETIME
)
''')

# 크기 수집 함수
def collect_sizes():
    for root, dirs, files in os.walk('/home'):
        for name in dirs + files:
            path = os.path.join(root, name)
            size = os.path.getsize(path)
            timestamp = datetime.now()
            cursor.execute('INSERT INTO size_data (path, size, timestamp) VALUES (?, ?, ?)', (path, size, timestamp))

    conn.commit()

# 스크립트 실행
if __name__ == "__main__":
    collect_sizes()
    conn.close()

이 스크립트는 /home 디렉토리의 모든 파일과 디렉토리의 크기를 수집하고 이를 size_data라는 SQLite 데이터베이스 테이블에 저장합니다.

1-2. 크론 잡 설정

이 스크립트를 1시간마다 실행하도록 크론에 등록합니다.

crontab -e

다음 줄을 추가하여 1시간마다 실행되도록 설정합니다.

0 * * * * /usr/bin/python3 /home/collect_sizes.py

2. 증가량 분석 및 시각화

데이터베이스에 저장된 데이터를 기반으로, 특정 기간(하루, 일주일, 한 달) 동안의 증가량을 계산하고, 이를 가시화하는 스크립트를 작성합니다.

2-1. Python 스크립트 작성

import sqlite3
from datetime import datetime, timedelta

def get_top_growth(period):
    conn = sqlite3.connect('/home/size_monitor.db')
    cursor = conn.cursor()

    # 특정 기간 동안의 증가량 계산
    end_time = datetime.now()
    start_time = end_time - period

    query = '''
    SELECT path, MAX(size) - MIN(size) AS growth
    FROM size_data
    WHERE timestamp BETWEEN ? AND ?
    GROUP BY path
    ORDER BY growth DESC
    LIMIT 10
    '''

    cursor.execute(query, (start_time, end_time))
    top_growth = cursor.fetchall()
    conn.close()

    return top_growth

def report_to_slack(message):
    import requests

    webhook_url = 'https://hooks.slack.com/services/your/webhook/url'
    slack_data = {'text': message}

    response = requests.post(webhook_url, json=slack_data)
    if response.status_code != 200:
        raise ValueError(f'Request to slack returned an error {response.status_code}, the response is:\n{response.text}')

def generate_report():
    periods = {
        "1일": timedelta(days=1),
        "1주일": timedelta(weeks=1),
        "1달": timedelta(days=30)
    }

    report = ""
    for period_name, period_duration in periods.items():
        top_growth = get_top_growth(period_duration)
        report += f"\n\n{period_name} 동안 증가폭 상위 10개:\n"
        for path, growth in top_growth:
            report += f"{path}: {growth} bytes\n"

    report_to_slack(report)

if __name__ == "__main__":
    generate_report()

2-2. 크론 잡에 등록

매일 아침 9시에 슬랙으로 보고서를 보내도록 크론 잡에 등록합니다.

crontab -e

다음 줄을 추가합니다.

0 9 * * * /usr/bin/python3 /home/generate_report.py

3. 슬랙 웹훅 설정

슬랙 웹훅 URL을 얻으려면 슬랙 앱 설정에서 새로운 Incoming Webhook을 생성하여 사용하면 됩니다.

 

위 스크립트를 통해 /home 디렉토리의 디렉토리 및 파일 크기를 주기적으로 모니터링하고, 증가폭이 높은 항목을 분석하여 상위 10개를 슬랙으로 자동 보고할 수 있습니다. 이를 통해 용량 증가 원인을 빠르게 파악하고 대응할 수 있습니다.

 

증가되는 용량을 기준으로 상위 디렉토리와 파일을 추출하기 위해, 이전에 수집한 데이터와 현재 데이터를 비교하는 방식으로 접근할 수 있습니다. 이 방식은 특정 기간 동안의 용량 증가를 계산하여, 가장 많이 증가한 디렉토리와 파일을 상위 10개 추출하는 방법입니다.

1. 데이터 수집 및 저장

이전 스크립트에서 데이터를 수집하여 데이터베이스에 저장하는 부분은 동일하게 유지합니다. 다만, 데이터를 수집할 때마다 이전에 기록된 데이터를 기준으로 증가량을 계산하는 추가 작업이 필요합니다.

2. 증가량 계산 및 저장

각 파일 및 디렉토리의 증가량을 계산하고 이를 데이터베이스에 저장하는 방식으로 수정할 수 있습니다.

2-1. Python 스크립트 수정

import os
import sqlite3
from datetime import datetime

# 데이터베이스 연결
conn = sqlite3.connect('/home/size_monitor.db')
cursor = conn.cursor()

# 테이블 생성 (존재하지 않는 경우)
cursor.execute('''
CREATE TABLE IF NOT EXISTS size_data (
    path TEXT,
    size INTEGER,
    growth INTEGER,
    timestamp DATETIME
)
''')

# 이전 크기 가져오기
def get_previous_size(path):
    cursor.execute('SELECT size FROM size_data WHERE path = ? ORDER BY timestamp DESC LIMIT 1', (path,))
    result = cursor.fetchone()
    return result[0] if result else 0

# 크기 수집 및 증가량 계산
def collect_and_calculate_growth():
    for root, dirs, files in os.walk('/home'):
        for name in dirs + files:
            path = os.path.join(root, name)
            current_size = os.path.getsize(path)
            previous_size = get_previous_size(path)
            growth = current_size - previous_size
            timestamp = datetime.now()

            cursor.execute('''
                INSERT INTO size_data (path, size, growth, timestamp)
                VALUES (?, ?, ?, ?)
            ''', (path, current_size, growth, timestamp))

    conn.commit()

# 스크립트 실행
if __name__ == "__main__":
    collect_and_calculate_growth()
    conn.close()

3. 증가량 상위 10개 추출 및 슬랙 리포팅

이제 특정 기간 동안 증가한 용량 기준으로 상위 10개 항목을 추출하여 보고하는 스크립트를 작성할 수 있습니다.

3-1. Python 스크립트 작성

import sqlite3
from datetime import datetime, timedelta

def get_top_growth(period):
    conn = sqlite3.connect('/home/size_monitor.db')
    cursor = conn.cursor()

    # 특정 기간 동안의 증가량 기준 상위 10개 추출
    end_time = datetime.now()
    start_time = end_time - period

    query = '''
    SELECT path, SUM(growth) AS total_growth
    FROM size_data
    WHERE timestamp BETWEEN ? AND ?
    GROUP BY path
    ORDER BY total_growth DESC
    LIMIT 10
    '''

    cursor.execute(query, (start_time, end_time))
    top_growth = cursor.fetchall()
    conn.close()

    return top_growth

def report_to_slack(message):
    import requests

    webhook_url = 'https://hooks.slack.com/services/your/webhook/url'
    slack_data = {'text': message}

    response = requests.post(webhook_url, json=slack_data)
    if response.status_code != 200:
        raise ValueError(f'Request to slack returned an error {response.status_code}, the response is:\n{response.text}')

def generate_report():
    periods = {
        "1일": timedelta(days=1),
        "1주일": timedelta(weeks=1),
        "1달": timedelta(days=30)
    }

    report = ""
    for period_name, period_duration in periods.items():
        top_growth = get_top_growth(period_duration)
        report += f"\n\n{period_name} 동안 증가폭 상위 10개:\n"
        for path, growth in top_growth:
            report += f"{path}: {growth} bytes 증가\n"

    report_to_slack(report)

if __name__ == "__main__":
    generate_report()

4. 스케줄링 및 리포팅

이 스크립트는 증가량이 가장 큰 디렉토리와 파일을 추출하여 슬랙에 보고합니다. 이 스크립트를 매일 실행되도록 크론에 등록하여 자동화할 수 있습니다.

crontab -e

다음과 같이 등록하여 매일 아침 9시에 보고하도록 합니다.

0 9 * * * /usr/bin/python3 /home/generate_report.py

이제 설정한 스크립트를 통해 /home 디렉토리에서 가장 많은 증가가 발생한 파일과 디렉토리를 추적하고, 이를 매일 슬랙으로 리포팅할 수 있습니다. 이를 통해 증가폭이 큰 파일 및 디렉토리를 신속하게 파악하고 조치할 수 있습니다.

728x90

댓글