특정 파티션(/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
디렉토리에서 가장 많은 증가가 발생한 파일과 디렉토리를 추적하고, 이를 매일 슬랙으로 리포팅할 수 있습니다. 이를 통해 증가폭이 큰 파일 및 디렉토리를 신속하게 파악하고 조치할 수 있습니다.
댓글