FA-TOOLS — Header Component

کد پایتون برای مانیتورینگ سرور و منابع سیستم

خلاصه کاربردی این مقاله:
با استفاده از اسکریپت پایتون ارائه شده در این راهنما، می‌توانید منابع حیاتی سرور خود (شامل پردازنده، رم، دیسک و ترافیک شبکه) را به صورت لحظه‌ای بررسی کنید. در صورت عبور مصرف از حد مجاز، سیستم به طور خودکار به شما هشدار ارسال می‌کند تا قبل از قطعی سرور اقدام کنید. تمام کدهای این آموزش تست‌شده و آماده‌ی استفاده در محیط‌های عملیاتی هستند.

نظارت مداوم بر وضعیت سرور مانع از قطعی‌های ناگهانی سرویس‌ها و خسارات مالی ناشی از آن می‌شود. پایتون به دلیل داشتن کتابخانه‌های قدرتمند و چندسکویی (Cross-platform)، بهترین ابزار برای نوشتن اسکریپت‌های سبک و سفارشی مانیتورینگ است. در این مقاله یاد می‌گیرید چگونه با چند خط کد، یک ناظر همیشگی برای منابع سرور خود بسازید.

۱. چرا مانیتورینگ خودکار سرور حیاتی است؟

کد پایتون برای مانیتورینگ سرور و منابع سیستم — تصویر 1

پاسخ کوتاه: مانیتورینگ خودکار سرور به شما امکان می‌دهد تا قبل از وقوع خرابی کامل، از پر شدن دیسک، مصرف غیرعادی رم یا فشار روی پردازنده باخبر شوید. این کار از دسترس خارج شدن سرویس‌ها جلوگری کرده و پایداری سیستم را تضمین می‌کند.

وقتی بار ترافیکی روی سایت یا اپلیکیشن شما افزایش می‌یابد، اولین جاهایی که دچار اختلال می‌شوند، حافظه موقت (RAM) و پردازنده (CPU) هستند. اگر ظرفیت دیسک سرور نیز پر شود، پایگاه‌های داده (مانند MySQL یا PostgreSQL) از کار می‌افتند و عملاً کل سیستم متوقف می‌شود. نوشتن یک اسکریپت شخصی‌سازی‌شده با پایتون به شما کنترل کامل می‌دهد تا بدون نیاز به نصب نرم‌افزارهای سنگین و پیچیده، از وضعیت سرور خود در هر لحظه آگاه باشید.

۲. پیش‌نیازها و راه‌اندازی محیط توسعه

کد پایتون برای مانیتورینگ سرور و منابع سیستم — تصویر 2

برای شروع کار با کدهای مانیتورینگ، به پایتون نسخه ۳ به بالا نیاز دارید. ابزار اصلی ما در این آموزش، کتابخانه قدرتمند psutil (process and system utilities) است. این کتابخانه اطلاعات دقیقی از منابع سیستم در لینوکس، ویندوز و مک به ما ارائه می‌دهد.

ابتدا با استفاده از ترمینال یا خط فرمان، این کتابخانه را نصب کنید. اگر به دنبال کدهای آماده‌ی بیشتر برای پروژه‌های خود هستید، می‌توانید بخش تکه‌کدهای پایتون را در سایت ما بررسی کنید.

pip install psutil requests

کتابخانه requests نیز برای ارسال هشدارهای مانیتورینگ به پیام‌رسان‌ها (مانند تلگرام یا دیسکورد) استفاده خواهد شد.

۳. نوشتن کدهای پایه برای مانیتورینگ منابع

کد پایتون برای مانیتورینگ سرور و منابع سیستم — تصویر 3

در این بخش تکه‌کدهای مجزا برای بررسی هر یک از منابع سیستم را بررسی می‌کنیم. این کدها به شکلی نوشته شده‌اند که کمترین میزان بارگذاری را روی پردازنده داشته باشند.

الف) مانیتورینگ مصرف پردازنده (CPU)

برای دریافت درصد مصرف پردازنده، از تابع زیر استفاده می‌کنیم. پارامتر interval تعیین می‌کند که نمونه‌برداری در چه بازه زمانی (به ثانیه) انجام شود:

import psutil

# دریافت درصد کلی مصرف CPU
cpu_usage = psutil.cpu_percent(interval=1)
print(f"CPU Usage: {cpu_usage}%")

# دریافت میزان مصرف هر هسته به صورت جداگانه
cores_usage = psutil.cpu_percent(interval=1, percpu=True)
for i, percentage in enumerate(cores_usage):
    print(f"Core {i}: {percentage}%")

ب) مانیتورینگ حافظه رم (RAM)

برای مدیریت حافظه رم، باید هم به درصد مصرف و هم به مقدار حافظه آزاد دسترسی داشته باشیم. متد virtual_memory این جزئیات را در اختیار ما قرار می‌دهد:

ram_info = psutil.virtual_memory()
total_ram = ram_info.total / (1024 ** 3) # تبدیل به گیگابایت
used_ram = ram_info.used / (1024 ** 3)
ram_percent = ram_info.percent

print(f"Total RAM: {total_ram:.2f} GB")
print(f"Used RAM: {used_ram:.2f} GB ({ram_percent}%)")

ج) مانیتورینگ فضای دیسک (Disk Space)

برای بررسی وضعیت پارتیشن‌ها، به خصوص دیسک روت (/ در لینوکس یا C: در ویندوز)، از کدهای زیر استفاده می‌کنیم:

disk_info = psutil.disk_usage('/')
total_disk = disk_info.total / (1024 ** 3)
free_disk = disk_info.free / (1024 ** 3)
disk_percent = disk_info.percent

print(f"Total Disk: {total_disk:.2f} GB")
print(f"Free Disk: {free_disk:.2f} GB ({100 - disk_percent:.2f}% free)")

د) مانیتورینگ ترافیک شبکه (Network)

میزان حجم داده‌های ارسالی و دریافتی کارت شبکه را می‌توان با متد زیر اندازه‌گیری کرد:

net_io = psutil.net_io_counters()
sent_mb = net_io.bytes_sent / (1024 ** 2) # تبدیل به مگابایت
recv_mb = net_io.bytes_recv / (1024 ** 2)

print(f"Sent: {sent_mb:.2f} MB | Received: {recv_mb:.2f} MB")

۴. اسکریپت مانیتورینگ یکپارچه با قابلیت ارسال هشدار (Alerting)

کد پایتون برای مانیتورینگ سرور و منابع سیستم — تصویر 4

پاسخ کوتاه: برای ساخت سیستم هشداردهنده، یک حلقه بی‌نهایت ایجاد می‌کنیم که وضعیت منابع را هر چند ثانیه بررسی کرده و در صورت رد شدن از آستانه مجاز (مثلاً مصرف بالای ۸۵٪)، پیام هشداری را به وب‌هوک دیسکورد یا تلگرام ارسال کند.

در اسکریپت زیر، ما یک ابزار کامل و آماده برای مانیتورینگ توسعه داده‌ایم. در این کد، قابلیت ارسال هشدار به وب‌هوک دیسکورد (یا هر API دیگر) گنجانده شده است تا بتوانید به سرعت از وضعیت بحرانی سرور خود باخبر شوید. برای مشاهده سایر راهکارهای برنامه‌نویسی وب، می‌توانید از منوی آرشیو کدهای آماده ما دیدن فرمایید.

import psutil
import time
import requests

# تنظیمات حد مجاز (آستانه هشدار)
CPU_THRESHOLD = 80.0    # درصد
RAM_THRESHOLD = 85.0    # درصد
DISK_THRESHOLD = 90.0   # درصد
CHECK_INTERVAL = 10     # فاصله زمانی بررسی (ثانیه)

# آدرس وب‌هوک دیسکورد یا تلگرام شما
WEBHOOK_URL = "https://discord.com/api/webhooks/your_webhook_here"

def send_alert(message):
    """ارسال پیام هشدار به پلتفرم‌های خارجی"""
    payload = {"content": f"⚠️ **هشدار مانیتورینگ سرور:**n{message}"}
    try:
        response = requests.post(WEBHOOK_URL, json=payload, timeout=5)
        if response.status_code == 204 or response.status_code == 200:
            print("Alert sent successfully.")
        else:
            print(f"Failed to send alert: {response.status_code}")
    except Exception as e:
        print(f"Error sending alert: {e}")

def monitor_server():
    print("Server monitoring started...")
    while True:
        # ۱. بررسی پردازنده
        cpu = psutil.cpu_percent(interval=1)
        
        # ۲. بررسی حافظه رم
        ram = psutil.virtual_memory().percent
        
        # ۳. بررسی فضای دیسک روت
        disk = psutil.disk_usage('/').percent
        
        # نمایش وضعیت در خروجی ترمینال
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] CPU: {cpu}% | RAM: {ram}% | Disk: {disk}%")
        
        # بررسی شرایط بحرانی
        alerts = []
        if cpu > CPU_THRESHOLD:
            alerts.append(f"مصرف پردازنده بالا است: {cpu}%")
        if ram > RAM_THRESHOLD:
            alerts.append(f"حافظه رم پر شده است: {ram}%")
        if disk > DISK_THRESHOLD:
            alerts.append(f"فضای دیسک رو به اتمام است: {disk}%")
            
        # در صورت وجود مشکل، هشدار ارسال می‌شود
        if alerts:
            alert_message = "n".join(alerts)
            send_alert(alert_message)
            
        # ایجاد وقفه تا اجرای بعدی
        time.sleep(CHECK_INTERVAL)

if __name__ == "__main__":
    monitor_server()

۵. مقایسه روش‌های مانیتورینگ سرور

کد پایتون برای مانیتورینگ سرور و منابع سیستم — تصویر 5

شاید برایتان سوال باشد که چرا باید از اسکریپت پایتون استفاده کنیم، در حالی که ابزارهای آماده وجود دارند؟ جدول زیر به این سوال پاسخ می‌دهد:

روش مانیتورینگ نقاط قوت و ضعف
اسکریپت سفارشی پایتون بسیار سبک (زیر ۱۰ مگابایت رم)، بدون نیاز به ابزار جانبی، شخصی‌سازی نامحدود شیوه ارسال هشدارها.
ابزارهای سنگین (Prometheus/Grafana) نمودارهای بسیار زیبا و پیشرفته، اما راه‌اندازی سخت و مصرف منابع زیاد که برای سرورهای کوچک مناسب نیست.
سرویس‌های ابری تجاری بدون نیاز به نگهداری، اما دارای هزینه‌های ماهانه بالا و چالش‌های تحریم یا حریم خصوصی داده‌ها.

۶. نکات تخصصی و چالش‌های دنیای واقعی

اجرای یک اسکریپت مانیتورینگ ساده در محیط توسعه آسان است، اما در محیط واقعی (Production) باید موارد زیر را در نظر بگیرید:

  • کنترل نشت حافظه (Memory Leak): اسکریپت مانیتورینگ برای ماه‌ها بدون وقفه اجرا می‌شود. اگر از متغیرهای سراسری بزرگ یا اشیاء رها نشده استفاده کنید، اسکریپت پایتون خود به مصرف‌کننده اصلی رم تبدیل خواهد شد. همیشه از توابع ایزوله و Garbage Collector پایتون کمک بگیرید.
  • جلوگیری از اسپم شدن هشدارها (Debouncing Alerts): اگر پردازنده برای ۵ دقیقه روی ۹۰٪ بماند و اسکریپت شما هر ۱۰ ثانیه بررسی انجام دهد، ۳۰ پیام هشدار تکراری دریافت خواهید کرد! باید مکانیزمی بنویسید که پس از ارسال یک هشدار، حداقل تا ۱۰ دقیقه بعد پیام تکراری نفرستد.
  • عملیات غیرمسدودکننده (Non-blocking I/O): ارسال وب‌هوک به دیسکورد یا تلگرام ممکن است به دلیل کندی شبکه چند ثانیه طول بکشد. این موضوع نباید روند بررسی منابع سیستم را متوقف کند. استفاده از کتابخانه‌هایی مانند threading یا asyncio در کدهای پیشرفته توصیه می‌شود.

۷. خودکارسازی اجرای اسکریپت در لینوکس

برای اینکه اسکریپت پایتون شما پس از بسته شدن ترمینال یا ری‌استارت شدن سرور همچنان به کار خود ادامه دهد، بهترین راه ایجاد یک systemd service در لینوکس است.

  1. یک فایل سرویس جدید بسازید:
    sudo nano /etc/systemd/system/py-monitor.service
  2. تنظیمات زیر را درون فایل قرار داده و ذخیره کنید (مسیر اسکریپت خود را جایگزین کنید):
    [Unit]
    Description=Python Server Monitor Service
    After=network.target
    
    [Service]
    Type=simple
    User=root
    ExecStart=/usr/bin/python3 /path/to/your/monitor.py
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
            
  3. سرویس را فعال و روشن کنید:
    sudo systemctl enable py-monitor.service
    sudo systemctl start py-monitor.service

۸. پرسش‌های متداول

آیا اجرای اسکریپت پایتون بار اضافی روی پردازنده سرور اعمال می‌کند؟
خیر، اگر فاصله زمانی بررسی‌ها (interval) را بیش از ۵ ثانیه تنظیم کنید، میزان مصرف پردازنده توسط این اسکریپت کمتر از ۰.۱ درصد خواهد بود و هیچ اثر منفی بر کارایی سرور ندارد.

چطور پیام‌های هشدار را به تلگرام ارسال کنیم؟
کافی است به جای وب‌هوک دیسکورد، از API ارسال پیام ربات تلگرام استفاده کنید. یعنی ارسال درخواست POST به آدرس api.telegram.org/bot[TOKEN]/sendMessage همراه با شناسه چت و متن پیام.

چگونه می‌توان مانیتورینگ را روی چند سرور مختلف اجرا کرد؟
شما می‌توانید این اسکریپت را روی هر تعداد سرور که می‌خواهید کپی کنید. فقط برای تشخیص بهتر پیام‌ها، نام یا IP هر سرور را در متن هشدارهای ارسالی بگنجانید.

آیا کتابخانه psutil در ویندوز سرور هم کار می‌کند؟
بله، این کتابخانه کاملاً مستقل از سیستم‌عامل است و کدهای نوشته شده با آن بدون هیچ تغییری روی سرورهای ویندوزی نیز اجرا می‌شوند.

۹. عیب‌یابی سریع مشکلات رایج

۱. خطای ModuleNotFoundError: No module named ‘psutil’

علت: کتابخانه روی نسخه پایتونی که اسکریپت را اجرا می‌کنید نصب نشده است.
راه‌حل: مطمئن شوید که دستور نصب را با پایتون درست اجرا کرده‌اید. در لینوکس از دستور pip3 install psutil استفاده کنید.

۲. خطای Permission Denied در حین خواندن اطلاعات دیسک

علت: برخی از دایرکتوری‌ها یا سیستم‌فایل‌های لینوکس برای خواندن نیاز به دسترسی روت دارند.
راه‌حل: اسکریپت را با دسترسی ادمین یا دستور sudo python3 monitor.py اجرا کنید یا دسترسی‌های مربوط به یوزرِ در حال اجرا را بررسی نمایید.

۳. عدم دریافت هشدارهای دیسکورد یا تلگرام در ایران

علت: محدودیت‌های اینترنتی و فیلترینگ روی برخی سرورهای داخلی.
راه‌حل: از یک هاست یا سرور خارج از کشور به عنوان پراکسی ارسال درخواست‌ها استفاده کنید یا یک پروکسی مناسب روی اسکریپت پایتون خود ست کنید.

سوالات متداول

برای اجرای این اسکریپت مانیتورینگ به چه پیش‌نیازهایی نیاز داریم؟

برای اجرای این کد به پایتون نسخه ۳ به بالا و نصب دو کتابخانه psutil (جهت استخراج اطلاعات سیستم) و requests (جهت ارسال پیام‌های هشدار به وب‌هوک) نیاز دارید.

آیا این کد پایتون روی سرورهای ویندوزی هم کار می‌کند؟

بله، کتابخانه psutil به صورت چندسکویی طراحی شده است و این اسکریپت بدون نیاز به تغییرات روی سیستم‌عامل‌های ویندوز، لینوکس و مکینتاش به درستی اجرا می‌شود.

سیستم ارسال هشدار (Alerting) در این اسکریپت چگونه کار می‌کند؟

این اسکریپت در فواصل زمانی مشخص منابع سیستم را بررسی کرده و در صورت عبور مصرف از حد آستانه مجاز، از طریق ارسال درخواست POST به وب‌هوک دیسکورد یا تلگرام به شما هشدار می‌دهد.

چطور می‌توان اجرای اسکریپت مانیتورینگ پایتون را در لینوکس خودکار و همیشگی کرد؟

بهترین روش برای اجرای دائمی این اسکریپت در پس‌زمینه لینوکس، تعریف آن به عنوان یک سرویس سیستمی (Systemd Service) یا استفاده از ابزارهایی مانند nohup و screen است.

Table of Contents

آخرین نوشته‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *