پاورشل برای برنامهنویسان
@programming_tipsپروژه – اسکریپت مانیتورینگ ساده (CPU, RAM, Disk)
در این درسنامه یاد میگیریم چطور در PowerShell یک اسکریپت مانیتورینگ ساده بنویسیم که وضعیت سختافزار سیستم مثل CPU، RAM و Disk را بررسی کند و در صورت نیاز هشدار بدهد یا نتایج را در یک فایل ذخیره کند. این نوع اسکریپتها برای ادمینها و توسعهدهندگان بسیار کاربردیاند چون کمک میکنند عملکرد سیستم را زیر نظر بگیرند و از کندی یا مشکلات احتمالی زودتر مطلع شوند.
۱. هدف پروژه
هدف از این پروژه این است که بتوانیم:
- میزان استفاده از CPU، حافظه RAM و فضای دیسک را بهدست آوریم.
- اطلاعات را به شکل خوانا در خروجی نمایش دهیم.
- اگر مقدار مصرف از حد مجاز بالاتر رفت، هشدار صادر کنیم.
- نتایج را در فایل لاگ ذخیره کنیم تا بعداً بتوان آن را تحلیل کرد.
۲. پیشنیازها
برای انجام این پروژه باید با مفاهیم پایه PowerShell، دستورات Get-Process و Get-WmiObject یا Get-Counter آشنا باشید. همچنین نیاز به سطح دسترسی معمولی کاربر دارید (اجرای PowerShell با Administrator اختیاری است، مگر بخواهید از اطلاعات سطح سیستمی استفاده کنید).
۳. طراحی منطق اسکریپت
منطق کلی اسکریپت به این صورت است:
- گرفتن درصد استفاده از CPU.
- بررسی میزان RAM استفاده شده و باقیمانده.
- بررسی فضای اشغالشده و خالی دیسک.
- نمایش همه اطلاعات در خروجی.
- ذخیره دادهها در فایل
log.txt. - در صورت بالاتر بودن مصرف از حد مجاز، نمایش هشدار قرمز رنگ.
۴. دریافت اطلاعات سیستم
دریافت استفاده از CPU
برای گرفتن درصد مصرف CPU از دستور Get-Counter استفاده میکنیم:
$cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue $cpu = [math]::Round($cpu, 2)
این دستور درصد استفاده کل از CPU را برمیگرداند و با تابع [math]::Round مقدار را تا دو رقم اعشار گرد میکنیم.
دریافت وضعیت RAM
برای بررسی وضعیت حافظه از Get-CimInstance استفاده میکنیم:
$ram = Get-CimInstance Win32_OperatingSystem $totalRAM = [math]::Round($ram.TotalVisibleMemorySize / 1MB, 2) $freeRAM = [math]::Round($ram.FreePhysicalMemory / 1MB, 2) $usedRAM = $totalRAM - $freeRAM
در اینجا مقدار کل و آزاد RAM به مگابایت محاسبه میشود.
بررسی فضای دیسک
میتوان از Get-PSDrive برای بررسی درایوها استفاده کرد:
$disks = Get-PSDrive -PSProvider FileSystem
برای هر درایو، فضای خالی و کل محاسبه میشود.
۵. نمایش اطلاعات در خروجی
حالا اطلاعات را به شکل خوانا نمایش میدهیم:
Write-Host "CPU Usage: $cpu%" -ForegroundColor Cyan
Write-Host "RAM Used: $usedRAM MB / $totalRAM MB" -ForegroundColor Cyan
foreach ($disk in $disks) {
$used = [math]::Round(($disk.Used / 1GB), 2)
$free = [math]::Round(($disk.Free / 1GB), 2)
Write-Host "Drive $($disk.Name): Used $used GB / Free $free GB" -ForegroundColor Cyan
}
این بخش وضعیت کلی سیستم را در قالبی رنگی و واضح نشان میدهد.
۶. اضافه کردن هشدارها
میتوانیم آستانههایی تعیین کنیم تا اگر مصرف بیش از حد شد هشدار نمایش داده شود:
if ($cpu -gt 80) {
Write-Host "⚠️ CPU usage is high: $cpu%" -ForegroundColor Red
}
if (($usedRAM / $totalRAM * 100) -gt 85) {
Write-Host "⚠️ RAM usage is high: $([math]::Round(($usedRAM / $totalRAM * 100), 2))%" -ForegroundColor Red
}
با این کار، وقتی مصرف CPU یا RAM زیاد شود، پیغام هشدار قرمز در ترمینال ظاهر میشود.
۷. ثبت گزارش در فایل
برای نگهداری تاریخچهی مصرف منابع، بهتر است اطلاعات در یک فایل لاگ نوشته شوند:
$logPath = "C:\Logs\system_monitor.log" $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logEntry = "$timestamp | CPU: $cpu% | RAM: $usedRAM/$totalRAM MB" Add-Content -Path $logPath -Value $logEntry
هر بار که اسکریپت اجرا میشود، این فایل یک خط جدید به گزارش اضافه میکند.
۸. اجرای دورهای (مانیتورینگ خودکار)
برای اینکه این مانیتورینگ خودکار شود، میتوان آن را در Task Scheduler اجرا کرد. مثلاً هر ۵ دقیقه یکبار:
- برنامه PowerShell را به عنوان Action تنظیم کنید.
- مسیر فایل اسکریپت را بدهید.
- Trigger را روی “Every 5 minutes” تنظیم کنید.
به این ترتیب، سیستم هر چند دقیقه یکبار چک میشود و نتایج در فایل لاگ ثبت میگردند.
۹. اسکریپت کامل
$cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
$cpu = [math]::Round($cpu, 2)
$ram = Get-CimInstance Win32_OperatingSystem
$totalRAM = [math]::Round($ram.TotalVisibleMemorySize / 1MB, 2)
$freeRAM = [math]::Round($ram.FreePhysicalMemory / 1MB, 2)
$usedRAM = $totalRAM - $freeRAM
$disks = Get-PSDrive -PSProvider FileSystem
Write-Host "CPU Usage: $cpu%" -ForegroundColor Cyan
Write-Host "RAM Used: $usedRAM MB / $totalRAM MB" -ForegroundColor Cyan
foreach ($disk in $disks) {
$used = [math]::Round(($disk.Used / 1GB), 2)
$free = [math]::Round(($disk.Free / 1GB), 2)
Write-Host "Drive $($disk.Name): Used $used GB / Free $free GB" -ForegroundColor Cyan
}
if ($cpu -gt 80) {
Write-Host "⚠️ CPU usage is high: $cpu%" -ForegroundColor Red
}
if (($usedRAM / $totalRAM * 100) -gt 85) {
Write-Host "⚠️ RAM usage is high: $([math]::Round(($usedRAM / $totalRAM * 100), 2))%" -ForegroundColor Red
}
$logPath = "C:\Logs\system_monitor.log"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logEntry = "$timestamp | CPU: $cpu% | RAM: $usedRAM/$totalRAM MB"
Add-Content -Path $logPath -Value $logEntry
۱۰. جمعبندی
در این پروژه یاد گرفتیم چگونه با چند دستور سادهی PowerShell یک ابزار مانیتورینگ سبک بسازیم که وضعیت CPU، RAM و دیسک را بررسی کند، هشدار بدهد و گزارش بنویسد. این اسکریپت میتواند پایهای برای ساخت ابزارهای پیشرفتهتر باشد؛ مثلاً افزودن مانیتورینگ شبکه، ارسال ایمیل هشدار یا ایجاد داشبورد گرافیکی با PowerShell GUI.
به این ترتیب، شما حالا میتوانید سیستم خود را بدون نیاز به ابزارهای جانبی و سنگین، بهصورت خودکار و دقیق پایش کنید.