ساخت ابزار خط فرمان مانیتورینگ منابع سیستم با پایتون و ثبت هشدار

با نوشتن یک اسکریپت پایتون سبک و قدرتمند، وضعیت پردازنده و رم سیستم را به صورت لحظه‌ای در خط فرمان مانیتور کنید و هشدار ثبت کنید.

🎧 خلاصه صوتی مقاله (پادکست ۲ دقیقه‌ای):

فرصت مطالعه ندارید؟ چکیده این مطلب را همین‌جا گوش دهید:

مدیریت و نظارت بر منابع سخت‌افزاری سیستم مانند پردازنده مرکزی (CPU) و حافظه رم (RAM) یکی از وظایف حیاتی برای توسعه‌دهندگان، مدیران سیستم و حتی کاربران حرفه‌ای است. هنگامی که سیستم ناگهان کند می‌شود یا فن دستگاه شروع به کارکردن با حداکثر سرعت می‌کند، پیدا کردن مقصر اصلی بدون داشتن ابزار مناسب کار دشواری است. نرم‌افزارهای گرافیکی مدیریت وظایف (Task Manager) معمولاً سنگین هستند و قابلیت‌های سفارشی‌سازی محدودی دارند. در این مقاله قصد داریم یک ابزار خط فرمان (CLI) سبک، مینیمال و کاملاً کاربردی با زبان برنامه‌نویسی پایتون بسازیم که به صورت لحظه‌ای وضعیت سخت‌افزار را بررسی کرده و در صورت عبور مصرف از حد مجاز، به صورت خودکار هشدارها را در فایل متنی ثبت (Log) کند.

زبان برنامه‌نویسیپایتون ۳.۶ به بالا
کتابخانه اصلیpsutil
نوع رابط کاربریخط فرمان (CLI / Terminal)
سیستم‌عامل‌های سازگارویندوز، لینوکس، مک‌او‌اس
هزینه۱۰۰٪ رایگان و متن‌باز
وضعیت دسترسی ایرانبدون محدودیت

مسئله و ضرورت داشتن ابزار مانیتورینگ سفارشی

بسیاری از اوقات پردازش‌های پس‌زمینه پنهانی، اسکریپت‌های رهاشده یا ابزارهای توسعه، بخش عمده‌ای از منابع سیستم را اشغال می‌کنند. استفاده از ابزارهای پیش‌فرض سیستم‌عامل همیشه انعطاف‌پذیر نیست و امکان ذخیره‌سازی خودکار داده‌های مصرفی در طول زمان برای تحلیل‌های بعدی را به راحتی فراهم نمی‌کند. با نوشتن یک ابزار خط فرمان اختصاصی، شما کنترل کاملی بر روی نحوه نمایش اطلاعات، فرکانس نمونه‌برداری و آستانه‌های بحرانی دارید. علاوه بر این، بررسی کدهای سیستمی شباهت زیادی به مهندسی دقیق ابزارهایی دارد که در حوزه‌های پیشرفته مانند ساخت صندوق‌های سرمایه‌گذاری هوشمند یا تحلیل‌های دقیق داده‌ها به کار می‌روند؛ مقالاتی نظیر ساخت صندوق سرمایه‌گذاری هوشمند با AutoHedge؛ ابزار متن‌باز نیز اهمیت اتوماسیون و نظارت هوشمند را به خوبی نشان می‌دهند.

نصب کتابخانه‌ها و پیش‌نیازها

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

pip install psutil

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

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

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

import time
from datetime import datetime
import psutil

# تنظیمات آستانه هشدار (بر حسب درصد)
CPU_THRESHOLD = 85.0
RAM_THRESHOLD = 85.0
LOG_FILE = "system_alert_log.txt"


def log_alert(message):
    """ثبت پیام‌های هشدار به همراه تاریخ و ساعت دقیق در فایل لاگ"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_entry = f"[{timestamp}] هشدار: {message}\n"
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(log_entry)
    except Exception as e:
        print(f"خطا در نوشتن فایل لاگ: {e}")


def get_top_process():
    """پیدا کردن پردازشی که بیشترین مصرف CPU را دارد"""
    top_proc = None
    max_cpu = 0.0
    for proc in psutil.process_iter(attrs=["pid", "name", "cpu_percent"]):
        try:
            cpu = proc.info["cpu_percent"]
            if cpu is not None and cpu > max_cpu:
                max_cpu = cpu
                top_proc = proc.info
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return top_proc


def main():
    print("=== ابزار خط فرمان مانیتورینگ سیستم آغاز به کار کرد ===")
    print(f"آستانه هشدار پردازنده: {CPU_THRESHOLD}% | آستانه هشدار رم: {RAM_THRESHOLD}%")
    print("برای خروج از برنامه، کلیدهای Ctrl+C را فشار دهید.\n")

    # یک بار فراخوانی اولیه cpu_percent برای جلوگیری از مقدار صفر در شروع
    psutil.cpu_percent(interval=None)
    time.sleep(1)

    try:
        while True:
            # دریافت وضعیت پردازنده و رم
            cpu_usage = psutil.cpu_percent(interval=None)
            ram_info = psutil.virtual_memory()
            ram_usage = ram_info.percent

            # پیدا کردن پردازش پرمصرف
            top_p = get_top_process()

            # پاکسازی خط قبلی ترمینال و چاپ وضعیت جدید (بازنشانی پویا)
            print(
                f"\rمصرف پردازنده: {cpu_usage:5.1f}% | مصرف رم: {ram_usage:5.1f}%",
                end="",
                flush=True,
            )

            # بررسی شرایط هشدار برای پردازنده
            if cpu_usage >= CPU_THRESHOLD:
                proc_name = (
                    top_p["name"] if top_p else "نامشخص (PID: {top_p['pid']})"
                )
                msg = f"مصرف پردازنده بحرانی شد: {cpu_usage}% | پردازش سنگین: {proc_name}"
                log_alert(msg)

            # بررسی شرایط هشدار برای رم
            if ram_usage >= RAM_THRESHOLD:
                msg = f"مصرف حافظه رم بحرانی شد: {ram_usage}% (فضای آزاد: {ram_info.available // (1024 * 1024)} مگابایت)"
                log_alert(msg)

            time.sleep(2)

    except KeyboardInterrupt:
        print("\n\nبرنامه متوقف شد. از همراهی شما سپاسگزاریم.")


if __name__ == "__main__":
    main()

توضیح بخش‌به‌بخش کد

این اسکریپت با دقت و با رعایت اصول بهینه‌سازی منابع نوشته شده است. در ادامه بخش‌های کلیدی آن را بررسی می‌کنیم:

  • تنظیمات اولیه (Constants): متغیرهای CPU_THRESHOLD و RAM_THRESHOLD مشخص می‌کنند که از چه درصدی به بعد، سیستم وارد وضعیت بحرانی شده و نیاز به ثبت رکورد در فایل متنی دارد.
  • تابع log_alert: وظیفه دارد هر زمان که مصرف منابع از حد مجاز گذشت، یک خط متن شامل تاریخ، ساعت دقیق و نوع خطا را به انتهای فایل system_alert_log.txt اضافه کند تا بعداً بتوانید علت کندی سیستم را بررسی کنید.
  • تابع get_top_process: با استفاده از روش پویای psutil.process_iter تمام فرآیندهای در حال اجرای سیستم را پیمایش می‌کند تا پردازشی که بیشترین بار پردازنده را به دوش می‌کشد شناسایی کند. مدیریت استثناها کمک می‌کند اگر فرآیندی در همان لحظه بسته شد، برنامه متوقف نشود.
  • ح حلقه اصلی و چاپ پویا: با استفاده از کاراکتر کنترلی \r (Carriage Return) و پارامتر end="" در دستور print، به جای رفتن به خط جدید، اطلاعات جدید روی خط قبلی بازنویسی می‌شود. این کار باعث ایجاد یک ظاهر پویای ترمینالی شبیه به ابزارهای حرفه‌ای لینوکس می‌شود.

نحوه اجرا و تست اسکریپت

برای اجرای موفقیت‌آمیز این کد، مراحل زیر را دنبال کنید:

  1. یک فایل متنی جدید به نام system_monitor.py در سیستم خود ایجاد کنید.
  2. کد ارائه‌شده در بخش قبلی را به طور کامل کپی کرده و درون این فایل جای‌گذاری (Paste) کنید و فایل را ذخیره کنید.
  3. ترمینال (در ویندوز: CMD یا PowerShell و در لینوکس/مک: Terminal) را باز کنید و به پوشه‌ای که فایل را در آن ذخیره کرده‌اید بروید.
  4. دستور زیر را برای اجرای اسکریپت وارد کنید:
python system_monitor.py

پس از اجرا، وضعیت لحظه‌ای مصرف CPU و RAM به صورت زنده در ترمینال نمایش داده می‌شود. اگر مصرف از ۸۵ درصد عبور کند، فایلی به نام system_alert_log.txt در کنار اسکریپت ایجاد شده و جزئیات هشدار در آن ثبت می‌شود.

خروجی نمونه

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

=== ابزار خط فرمان مانیتورینگ سیستم آغاز به کار کرد ===
آستانه هشدار پردازنده: 85.0% | آستانه هشدار رم: 85.0%
برای خروج از برنامه، کلیدهای Ctrl+C را فشار دهید.

مصرف پردازنده:  24.5% | مصرف رم:  62.1%

و در صورتی که مصرف پردازنده به صورت غیرمجاز بالا برود، محتوای فایل system_alert_log.txt به شکل زیر در خواهد آمد:

[2026-10-18 14:32:10] هشدار: مصرف پردازنده بحرانی شد: 91.2% | پردازش سنگین: chrome.exe

ایده‌های توسعه و شخصی‌سازی

این ابزار پایه را می‌توانید به روش‌های مختلفی ارتقا دهید تا با نیازهای خاص شما مطابقت پیدا کند:

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

خطاهای رایج و راه‌حل‌ها

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

  • خطای کمبود دسترسی (Access Denied): در برخی سیستم‌عامل‌ها، بررسی جزئیات پردازش‌های سیستمی دیگر کاربران نیاز به دسترسی‌های مدیریتی دارد. برای حل این مشکل، ترمینال خود را با دسترسی Administrator (در ویندوز) یا با دستور sudo (در لینوکس) اجرا کنید.
  • صفر بودن مداوم درصد پردازنده در اولین اجرا: کتابخانه psutil برای محاسبه دقیق درصد پردازنده نیاز به یک بازه زمانی دارد. وجود دستور اولیه cpu_percent(interval=None) در ابتدای کد این مشکل را به طور کامل حل می‌کند.

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

آیا این اسکریپت خودش منابع زیادی از سیستم را مصرف می‌کند؟

خیر. به دلیل استفاده از کتابخانه بهینه psutil و داشتن تاخیر زمانی (Sleep) دو ثانیه‌ای، این اسکریپت عملاً کمتر از ۰.۱ درصد از منابع پردازنده را مصرف می‌کند و کاملاً سبک است.

چگونه می‌توانم بازه زمانی به‌روزرسانی اطلاعات را تغییر دهم؟

کافی است مقدار ورودی تابع time.sleep(2) در انتهای حلقه اصلی را به عدد دلخواه خود (بر حسب ثانیه) تغییر دهید.

آیا این ابزار روی تمام نسخه‌های ویندوز و لینوکس کار می‌کند؟

بله، کتابخانه psutil کاملاً کراس‌پلتفرم است و روی سیستم‌عامل‌های ویندوز، لینوکس و مک‌او‌اس بدون مشکل کار می‌کند.

جمع‌بندی

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

پاسخی بگذارید

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