Python скрипт за мониторинг на CPU, RAM и дискове с psutil

На скоро ми се наложи да напиша Python скрипт за мониторинг на системните ресурси. Работех по проект, който изискваше непрекъснато следене на производителността на сървъра. Класическите инструменти като htop
и top
са отлични, но имах нужда от нещо по-персонализирано – скрипт, който да записва данни, изпраща алерти и да може да се интегрира с други системи.
Точно тогава открих силата на Python библиотеката psutil
. Оказа се, че с няколко реда код можех да създам собствен мониторинг инструмент, който работи точно както искам.
Python библиотеката psutil
е като швейцарско ножче за системните ресурси. Тя ни позволява да създадем собствен инструмент за мониторинг с няколко реда код. В тази статия ще създадем практичен скрипт за следене на CPU, RAM и дискове.
Защо да използвам psutil?
psutil
е мощна библиотека, която работи на всички операционни системи. Тя е лесна за използване и не изисква административни права. Библиотеката е като мост между Python и системните ресурси.
Най-големите предимства на psutil
са:
- Кросплатформена съвместимост
- Богат набор от функции
- Активна поддръжка
- Отлична документация
Инсталация и първи стъпки
Първо инсталираме библиотеката:
pip install psutil
Нека започнем с прост пример за проверка на CPU:
import psutil
# Получаваме процентното натоварване на CPU
cpu_percent = psutil.cpu_percent(interval=1)
print(f"CPU използване: {cpu_percent}%")
Този код е като термометър за процесора. Параметърът interval=1
означава, че мерим за 1 секунда.
Мониторинг на CPU
CPU мониторингът е основа на всяка система за следене. Ето как да получим подробна информация:
import psutil
import time
def monitor_cpu():
"""Мониторинг на CPU информация"""
# Общо натоварване
cpu_total = psutil.cpu_percent(interval=1)
# Натоварване по ядра
cpu_cores = psutil.cpu_percent(interval=1, percpu=True)
# Информация за процесора
cpu_freq = psutil.cpu_freq()
cpu_count = psutil.cpu_count()
print(f"=== CPU МОНИТОРИНГ ===")
print(f"Общо натоварване: {cpu_total}%")
print(f"Брой ядра: {cpu_count}")
print(f"Честота: {cpu_freq.current:.2f} MHz")
print("\nНатоварване по ядра:")
for i, core in enumerate(cpu_cores):
print(f" Ядро {i+1}: {core}%")
Този код е като детален доклад за състоянието на процесора. Можете да видите не само общото натоварване, но и как работи всяко ядро поотделно.
Мониторинг на RAM
Паметта е като работната маса на компютъра. Колкото повече място имаме, толкова повече можем да работим едновременно:
def monitor_memory():
"""Мониторинг на RAM паметта"""
# Физическа памет
memory = psutil.virtual_memory()
# Swap памет
swap = psutil.swap_memory()
print(f"=== ПАМЕТ МОНИТОРИНГ ===")
print(f"Обща памет: {memory.total / (1024**3):.2f} GB")
print(f"Използвана: {memory.used / (1024**3):.2f} GB")
print(f"Свободна: {memory.available / (1024**3):.2f} GB")
print(f"Процент: {memory.percent}%")
print(f"\nSwap памет:")
print(f"Обща: {swap.total / (1024**3):.2f} GB")
print(f"Използвана: {swap.used / (1024**3):.2f} GB")
print(f"Процент: {swap.percent}%")
Този код показва не само колко памет използваме, но и swap паметта. Swap е като допълнителна памет на диска, която се използва когато RAM се запълни.
Мониторинг на дискове
Дисковото пространство е като склад – трябва да знаем какво имаме и колко място остава:
def monitor_disk():
"""Мониторинг на дискове"""
print(f"=== ДИСКОВЕ МОНИТОРИНГ ===")
# Получаваме всички дискове
partitions = psutil.disk_partitions()
for partition in partitions:
try:
# Статистика за всеки диск
disk_usage = psutil.disk_usage(partition.mountpoint)
print(f"\nДиск: {partition.device}")
print(f"Файлова система: {partition.fstype}")
print(f"Общо: {disk_usage.total / (1024**3):.2f} GB")
print(f"Използвано: {disk_usage.used / (1024**3):.2f} GB")
print(f"Свободно: {disk_usage.free / (1024**3):.2f} GB")
print(f"Процент: {disk_usage.used / disk_usage.total * 100:.2f}%")
except PermissionError:
print(f"Няма достъп до {partition.device}")
Този код е като обхода на склада. Проверяваме всеки диск и виждаме колко място имаме.
Мониторинг на мрежата
Мрежовата активност е като пулса на системата. Ето как да я следим:
def monitor_network():
"""Мониторинг на мрежата"""
# Мрежова статистика
net_io = psutil.net_io_counters()
print(f"=== МРЕЖА МОНИТОРИНГ ===")
print(f"Изпратени байтове: {net_io.bytes_sent / (1024**2):.2f} MB")
print(f"Получени байтове: {net_io.bytes_recv / (1024**2):.2f} MB")
print(f"Изпратени пакети: {net_io.packets_sent}")
print(f"Получени пакети: {net_io.packets_recv}")
Пълен мониторинг скрипт
Ето как да комбинирах всичко в един скрипт:
import psutil
import time
import os
from datetime import datetime
class SystemMonitor:
"""Клас за мониторинг на системните ресурси"""
def __init__(self):
self.start_time = time.time()
def get_cpu_info(self):
"""Получава CPU информация"""
cpu_percent = psutil.cpu_percent(interval=1)
cpu_count = psutil.cpu_count()
cpu_freq = psutil.cpu_freq()
return {
'percent': cpu_percent,
'count': cpu_count,
'frequency': cpu_freq.current if cpu_freq else 0
}
def get_memory_info(self):
"""Получава информация за паметта"""
memory = psutil.virtual_memory()
swap = psutil.swap_memory()
return {
'total': memory.total,
'used': memory.used,
'available': memory.available,
'percent': memory.percent,
'swap_total': swap.total,
'swap_used': swap.used,
'swap_percent': swap.percent
}
def get_disk_info(self):
"""Получава информация за дисковете"""
disks = []
partitions = psutil.disk_partitions()
for partition in partitions:
try:
usage = psutil.disk_usage(partition.mountpoint)
disks.append({
'device': partition.device,
'mountpoint': partition.mountpoint,
'fstype': partition.fstype,
'total': usage.total,
'used': usage.used,
'free': usage.free,
'percent': (usage.used / usage.total) * 100
})
except PermissionError:
continue
return disks
def get_network_info(self):
"""Получава мрежова информация"""
net_io = psutil.net_io_counters()
return {
'bytes_sent': net_io.bytes_sent,
'bytes_recv': net_io.bytes_recv,
'packets_sent': net_io.packets_sent,
'packets_recv': net_io.packets_recv
}
def display_info(self):
"""Показва цялата информация"""
os.system('clear' if os.name == 'posix' else 'cls')
print("=" * 60)
print(f"СИСТЕМЕН МОНИТОРИНГ - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# CPU информация
cpu = self.get_cpu_info()
print(f"\n🖥️ CPU:")
print(f" Натоварване: {cpu['percent']:.1f}%")
print(f" Ядра: {cpu['count']}")
print(f" Честота: {cpu['frequency']:.0f} MHz")
# Памет
memory = self.get_memory_info()
print(f"\n💾 ПАМЕТ:")
print(f" Използвана: {memory['used'] / (1024**3):.2f} GB / {memory['total'] / (1024**3):.2f} GB")
print(f" Процент: {memory['percent']:.1f}%")
print(f" Свободна: {memory['available'] / (1024**3):.2f} GB")
# Дискове
disks = self.get_disk_info()
print(f"\n💿 ДИСКОВЕ:")
for disk in disks:
print(f" {disk['device']}: {disk['used'] / (1024**3):.1f} GB / {disk['total'] / (1024**3):.1f} GB ({disk['percent']:.1f}%)")
# Мрежа
network = self.get_network_info()
print(f"\n🌐 МРЕЖА:")
print(f" Изпратени: {network['bytes_sent'] / (1024**2):.1f} MB")
print(f" Получени: {network['bytes_recv'] / (1024**2):.1f} MB")
print("\n" + "=" * 60)
print("Натиснете Ctrl+C за изход")
def run(self, interval=5):
"""Стартира мониторинга"""
try:
while True:
self.display_info()
time.sleep(interval)
except KeyboardInterrupt:
print("\n\nМониторингът е спрян.")
# Стартиране на скрипта
if __name__ == "__main__":
monitor = SystemMonitor()
monitor.run(interval=3) # Обновява на всеки 3 секунди
Дабавих и имоджита за по добра визия.
Добавяне на алерти
Мониторингът без алерти е като пазач, който спи. Ето как да добавим предупреждения:
class AlertSystem:
"""Система за алерти"""
def __init__(self):
self.thresholds = {
'cpu': 80, # 80% CPU
'memory': 85, # 85% RAM
'disk': 90 # 90% диск
}
def check_alerts(self, cpu_percent, memory_percent, disk_percent):
"""Проверява за алерти"""
alerts = []
if cpu_percent > self.thresholds['cpu']:
alerts.append(f"🚨 ВИСО CPU: {cpu_percent:.1f}%")
if memory_percent > self.thresholds['memory']:
alerts.append(f"🚨 ВИСОКА ПАМЕТ: {memory_percent:.1f}%")
if disk_percent > self.thresholds['disk']:
alerts.append(f"🚨 ВИСОК ДИСК: {disk_percent:.1f}%")
return alerts
Съхраняване на данни
Мониторингът без история е като дневник без страници. Ето как да съхраняваме данните:
import json
from datetime import datetime
class DataLogger:
"""Съхраняване на мониторинг данни"""
def __init__(self, filename="system_monitor.json"):
self.filename = filename
self.data = []
def log_data(self, cpu, memory, disk, network):
"""Записва данни"""
entry = {
'timestamp': datetime.now().isoformat(),
'cpu_percent': cpu['percent'],
'memory_percent': memory['percent'],
'disk_usage': sum(d['percent'] for d in disk) / len(disk) if disk else 0,
'network_sent': network['bytes_sent'],
'network_recv': network['bytes_recv']
}
self.data.append(entry)
# Запазваме само последните 1000 записа
if len(self.data) > 1000:
self.data = self.data[-1000:]
def save_to_file(self):
"""Съхранява данните във файл"""
with open(self.filename, 'w') as f:
json.dump(self.data, f, indent=2)
def load_from_file(self):
"""Зарежда данните от файл"""
try:
with open(self.filename, 'r') as f:
self.data = json.load(f)
except FileNotFoundError:
self.data = []
Съвети за оптимизация
Когато работите с мониторинг, има няколко важни неща да помните:
Интервали на обновяване: Не обновявайте твърде често. Всеки 3-5 секунди е достатъчно за повечето случаи.
Производителност: psutil
е бърз, но все пак използва системни ресурси. Следете собственото си потребление.
Грешки: Винаги обработвайте грешки, особено при достъп до дискове и мрежа.
История: Съхранявайте данни за анализ, но не претоварвайте диска.
Заключение
Създаването на собствен мониторинг инструмент с Python и psutil
е като изграждането на персонален помощник за системата. Той ви помага да разберете как работи компютърът ви и да предотвратите проблеми.
Този скрипт е основа, върху която можете да строите. Можете да добавите графики, уеб интерфейс, или дори да изпращате данните към облачни услуги.
Най-важното е да започнете с прост код и постепенно да добавяте функции. Всеки опитен програмист е започвал с основите.
Мониторингът е като грижата за здравето – по-добре да предотвратим проблемите, отколкото да ги решаваме след това. С правилните инструменти и малко код можете да превърнете компютъра си в самонаблюдаваща се система.
Опитайте скрипта, експериментирайте с него и споделете вашите подобрения с общността. Това е начинът, по който всички учим и се развиваме заедно.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut