Python 활용 Rocky Linux 9 시스템 모니터링 도구 개발

Python을 활용하여 Linux 시스템 모니터링 도구를 만들어 볼려고 합니다.

해당 글에서 사용하는 파이썬 라이브러리는 아래와 같습니다.

  • psutil: 시스템 및 프로세스 정보 수집
  • platform: OS 정보 수집
  • rich: 터미널 UI 구현
  • socket: 호스트명 정보 수집
  • datetime: 시간 정보 표시
  • time: 대기 시간 구현

가장 중요한 모니터링 도구에서의 기능 구현은 아래와 같이 기본적인 시스템의 정보 데이터를 수집하게 됩니다.

– 시스템 정보 수집

– OS 정보 (운영체제, 버전, 호스트명)

– CPU 정보 (코어 수, 사용률)

– 메모리 정보 (총량, 사용량, 여유량)

– 디스크 정보 (총량, 사용량, 여유량)

– 네트워크 정보 (송수신 데이터량)

– 실시간 모니터링

– CPU 사용률 추적

– 메모리 사용량 모니터링

– 디스크 사용량 확인

– 네트워크 트래픽 모니터링


모든 환경은 리눅스 서버 내부에서 root권한으로 이루어집니다.

1. 시스템 패키지 업데이트

# 시스템 패키지 업데이트
dnf update -y

# 개발 도구 설치
dnf groupinstall "Development Tools" -y

2. Python 관련 기본 패키지 설치

# Python 3 및 관련 도구 설치
dnf install python3 python3-devel python3-pip -y

# pip 업그레이드
python3 -m pip install --upgrade pip

3. 필수 Python 라이브러리 설치

# psutil 설치를 위한 시스템 라이브러리
dnf install gcc python3-devel systemd-devel -y

# 필요한 Python 패키지 설치
pip3 install psutil rich

psutil이란?

– 시스템 모니터링을 위한 크로스 플랫폼 라이브러리

– 시스템 리소스 사용량 검색

– 실행 중인 프로세스 관리

– 다양한 플랫폼 지원 (Linux, Windows, macOS, FreeBSD 등)

psutil의 주요 기능 몇가지를 간단하게 알아보겠습니다.

import psutil

# CPU 사용률
cpu_percent = psutil.cpu_percent(interval=1)  # CPU 전체 사용률
cpu_per_cpu = psutil.cpu_percent(interval=1, percpu=True)  # CPU 코어별 사용률

# CPU 개수
cpu_count = psutil.cpu_count()  # 논리적 CPU 수
physical_cpu = psutil.cpu_count(logical=False)  # 물리적 CPU 수

# CPU 주파수
cpu_freq = psutil.cpu_freq()  # current, min, max 주파수

# 메모리 정보
memory = psutil.virtual_memory()
print(f"총 메모리: {memory.total / (1024**3):.2f} GB")
print(f"사용 가능: {memory.available / (1024**3):.2f} GB")
print(f"사용률: {memory.percent}%")

# 스왑 메모리
swap = psutil.swap_memory()
print(f"스왑 총량: {swap.total / (1024**3):.2f} GB")
print(f"스왑 사용률: {swap.percent}%")

# 디스크 사용량
disk = psutil.disk_usage('/')
print(f"총 용량: {disk.total / (1024**3):.2f} GB")
print(f"사용 중: {disk.used / (1024**3):.2f} GB")
print(f"여유 공간: {disk.free / (1024**3):.2f} GB")

# 디스크 파티션
partitions = psutil.disk_partitions()
for partition in partitions:
    print(f"장치: {partition.device}")
    print(f"마운트 포인트: {partition.mountpoint}")
    
# 네트워크 인터페이스
net_io = psutil.net_io_counters()
print(f"전송된 바이트: {net_io.bytes_sent}")
print(f"수신된 바이트: {net_io.bytes_recv}")

# 네트워크 연결
connections = psutil.net_connections()
for conn in connections:
    print(f"로컬 주소: {conn.laddr}")
    print(f"상태: {conn.status}")
    
# 실행 중인 프로세스 목록
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
    print(f"PID: {proc.info['pid']}")
    print(f"이름: {proc.info['name']}")
    print(f"CPU 사용률: {proc.info['cpu_percent']}%")

4. 패키지 설치가 끝나면 버전 확인

파이썬 및 필수 패키지 버전 확인

준비가 끝나면 다음 단계 파이썬 코드를 구현

import psutil
import platform
import os
import datetime
import socket
from rich.console import Console
from rich.table import Table
from rich.live import Live
import time

class SystemMonitor:
    def __init__(self):
        self.console = Console()  # Rich 라이브러리의 콘솔 객체 초기화

    def get_system_info(self):
        # 시스템 기본 정보 수집!
        try:
            # OS 정보
            os_info = {
                "OS": platform.system(), # 운영체제 종류
                "OS Version": platform.version(),  # OS 버전
                "OS Release": platform.release(), # OS 릴리즈
                "Hostname": socket.gethostname(), # 호스트명
                "Architecture": platform.machine(),# 시스템 아키텍처
                "Processor": platform.processor() # 프로세서 정보
            }

            # CPU 정보
            cpu_info = {
                "CPU Cores": psutil.cpu_count(logical=False), # 물리적 코어 수
                "CPU Threads": psutil.cpu_count(logical=True), # 논리적 코어 수
                "CPU Usage": f"{psutil.cpu_percent()}%"   # CPU 사용률
            }

            # 메모리 정보 수집 (GB 단위로 변환)
            memory = psutil.virtual_memory()
            memory_info = {
                "Total Memory": f"{memory.total / (1024**3):.2f} GB",
                "Available Memory": f"{memory.available / (1024**3):.2f} GB",
                "Memory Usage": f"{memory.percent}%"
            }

            # 디스크 정보 수집 (GB 단위로 변환)
            disk = psutil.disk_usage('/')
            disk_info = {
                "Total Disk": f"{disk.total / (1024**3):.2f} GB",
                "Used Disk": f"{disk.used / (1024**3):.2f} GB",
                "Free Disk": f"{disk.free / (1024**3):.2f} GB",
                "Disk Usage": f"{disk.percent}%"
            }

            # 네트워크 정보
            net = psutil.net_io_counters()
            network_info = {
                "Bytes Sent": f"{net.bytes_sent / (1024**2):.2f} MB",
                "Bytes Received": f"{net.bytes_recv / (1024**2):.2f} MB",
                "Packets Sent": net.packets_sent,
                "Packets Received": net.packets_recv
            }

            return {
                "OS Information": os_info,
                "CPU Information": cpu_info,
                "Memory Information": memory_info,
                "Disk Information": disk_info,
                "Network Information": network_info
            }
        except Exception as e:
            return {"Error": str(e)}

    def display_info(self):
        # 시스템 정보를 테이블 형식으로 표시
        info = self.get_system_info()
        
        # 각 카테고리별로 테이블 생성
        for category, data in info.items():
            table = Table(title=category, title_style="bold cyan")
            table.add_column("Property", style="cyan")
            table.add_column("Value", style="green")
            
            # 테이블에 데이터 추가
            for key, value in data.items():
                table.add_row(str(key), str(value))
            
            self.console.print(table)
            self.console.print()

    def monitor_live(self, interval=1):
        """실시간 시스템 모니터링"""
        try:
            while True:
                self.console.clear() # 화면 클리어
                
                # CPU 사용량 모니터링 (색상 코딩)
                self.console.print(f"[bold cyan]System Monitor - {datetime.datetime.now()}[/bold cyan]")
                self.console.print()
                
                # CPU 사용량 모니터링
                cpu_percent = psutil.cpu_percent(interval=1)
                cpu_color = "green" if cpu_percent < 70 else "yellow" if cpu_percent < 90 else "red"
                self.console.print(f"CPU Usage: [{cpu_color}]{cpu_percent}%[/{cpu_color}]")
                
                # 메모리 사용량 모니터링
                memory = psutil.virtual_memory()
                mem_color = "green" if memory.percent < 70 else "yellow" if memory.percent < 90 else "red"
                self.console.print(f"Memory Usage: [{mem_color}]{memory.percent}%[/{mem_color}]")
                
                # 디스크 사용량 모니터링
                disk = psutil.disk_usage('/')
                disk_color = "green" if disk.percent < 70 else "yellow" if disk.percent < 90 else "red"
                self.console.print(f"Disk Usage: [{disk_color}]{disk.percent}%[/{disk_color}]")
                
                # 네트워크 사용량 모니터링
                net = psutil.net_io_counters()
                self.console.print(f"Network Send: {net.bytes_sent / (1024**2):.2f} MB")
                self.console.print(f"Network Recv: {net.bytes_recv / (1024**2):.2f} MB")
                
                # 업데이트 간격만큼 대기
                time.sleep(interval)
                
        except KeyboardInterrupt:
            self.console.print("\n[yellow]Monitoring stopped by user[/yellow]")

# 메인메뉴
def main():
    monitor = SystemMonitor()
    
    while True:
        console = Console()
        console.print("\n[bold cyan]System Monitor Menu:[/bold cyan]")
        console.print("1. Show System Information")
        console.print("2. Start Live Monitoring")
        console.print("3. Exit")
        
        choice = input("\nEnter your choice (1-3): ")
        
        if choice == '1':
            monitor.display_info()
        elif choice == '2':
            console.print("\n[bold cyan]Starting Live Monitoring (Press Ctrl+C to stop):[/bold cyan]")
            monitor.monitor_live()
        elif choice == '3':
            console.print("[yellow]Exiting...[/yellow]")
            break
        else:
            console.print("[red]Invalid choice. Please try again.[/red]")

if __name__ == "__main__":
    main()

간단한 코드 구조는

  • – SystemMonitor 클래스 구조
  • – get_system_info(): 시스템 정보 수집
  • – display_info(): 정보 표시
  • – monitor_live(): 실시간 모니터링
  • – 예외 처리 및 에러 핸들링

색상 컬러 코딩의 경우

  • – 컬러 코딩 시스템
  • – 녹색: 정상 상태 (< 70%)
  • – 노란색: 주의 상태 (70-90%)
  • – 빨간색: 경고 상태 (> 90%)

코드 구현이 완료되면 “python3 system_monitor.py” 실행

파이썬 코드 실행

1번 옵션의 경우 시스템 정보를 표시하게 됩니다.

시스템 정보 표기

2번은 실시간 모니터링으로 interval=1로 설정되어 리프레쉬 되면서 실시간으로 서버의 정보를 표시하게 됩니다.

실시간 모니터링

이렇게 파이썬을 활용하면 리눅스 서버에서 간단하게 정보를 확인할 수 있는 코드를 구현할 수 있습니다.

감사합니다.

질문 사항은 댓글에 남겨주시면 답변드리도록 하겠습니다.

By Low ahn

리눅스를 처음 접하시는 분들은 위한 다양한 리눅스 정보를 공유합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다