Нужно следить за использованием ресурсов сервера в течение 30 минут и отправлять почту в Powershell - PullRequest
2 голосов
/ 04 февраля 2020

Я разработал сценарий PowerShell, который отслеживает производительность сервера, такую ​​как средняя загрузка ЦП, память и Cdrive, и, если какой-либо ресурс пересекает пороговое значение, он вызывает почту. Мой сценарий работает нормально, но я хочу отслеживать его в течение 30 минут, и если через 30 минут он преодолеет только пороговое значение, он вызовет почту.

<#
    .SYNOPSIS
    Script for the detailed server health report

    .DESCRIPTION
    The script accepts parameter from CSV file by which we can get details and
    all information related to health status of the server.The script generates all the 
    information in a CSv file.

#>
    [CmdletBinding(SupportsShouldProcess=$True)]

    param(
        [Parameter(Position=0,mandatory=$true)]
        [string]$Servercsv
    )
    begin{
        Write-Host "Running"
    }
    process{

         # Path for the CSV file that contains all the Print Server information.
        $ServerDetails=import-csv $Servercsv
        $result=@()
        $Outputreport = $null

         foreach($server in $ServerDetails){

         try{    

             #sysinfo variable contains complete systeminfo like manufacturer name, physical memory,servername 

             $cpu=Get-WMIObject  -ComputerName $server.servers win32_processor| select __Server, @{name="CPUUtilization" ;expression ={“{0:N2}” -f (get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 6 |
                select -ExpandProperty countersamples | select -ExpandProperty cookedvalue | Measure-Object -Average).average}}

             $disks =Get-WmiObject -Class win32_Volume -ComputerName $server.servers -Filter "DriveLetter = 'C:'" |
                Select-object @{Name = "PercentFree"; Expression = {“{0:N2}” -f  (($_.FreeSpace / $_.Capacity)*100) } }


             $os=Get-WmiObject -Class win32_operatingsystem -computername $server.servers |
                Select-Object @{Name = "MemoryUsage"; Expression = {“{0:N2}” -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize) }}

        $result += [PSCustomObject] @{  
            ServerName ="$($server.servers)" 
            CPUUtilization = $cpu.CPUUtilization.ToString()
            CDrive = $disks.PercentFree
            MemLoad = $OS.MemoryUsage

            }
            }

            catch{
         "error communicating with $($server.servers), skipping to next"
         }
         }

    $Outputreport = "<HTML><TITLE> Utilization of Server Resources</TITLE>
                     <BODY background-color:peachpuff>
                     <font color =""#99000"" face=""arial"">
                     <H3> Utilization of Server Resources</H3></font>
                     <Table border=2 cellpadding=1 cellspacing=5>
                     <TR bgcolor=gray align=center>
                       <TD><B>Server Name</B></TD>
                       <TD><B>CPUUtilization</B></TD>
                       <TD><B>Memory Utilization</B></TD>
                       <TD><B>CDrive</B></TD></TR>"


    Foreach($Entry in $Result){

    if(([decimal]$Entry.CPUUtilization -ge 25) -or ([decimal]$Entry.MemLoad -ge 50) -or (([decimal]$Entry.CDrive) -le 60) )
    {
    $Outputreport += "<TR>"

     $Outputreport += "<TD><B>$($Entry.Servername)</B></TD>"
     if([decimal]$Entry.CPUUtilization -ge 25)
        {

        $Outputreport += "<TD align=center style=color:red;>$($Entry.CPUUtilization+'%')</TD>"
        }
        else {
        $Outputreport += "<TD align=center style=color:White;>$($Entry.CPUUtilization+'%')</TD>"
        }


        if([decimal]$Entry.MemLoad -ge 50)
        {

        $Outputreport += "<TD align=center style=color:red;>$($Entry.MemLoad+'%')</TD>"
        }
        else{
         $Outputreport += "<TD align=center style=color:White;>$($Entry.MemLoad+'%')</TD>"
         }



       if(([decimal]$Entry.CDrive) -le 60)
       { 

        $Outputreport += "<TD align=center style=color:red;>$($Entry.Cdrive+'%')</TD>"
        }
        else{ $Outputreport += "<TD align=center style=color:White;>$($Entry.Cdrive+'%')</TD>"}


         #$Outputreport += "<TD>$($Entry.Servername)</TD>"


         #$Outputreport += "<TD>$($Entry.Servername)</TD>"

        $Outputreport+="</TR>"

           }



     }

     $Outputreport += "</Table><p>Regards,<br>Rujhaan Bhatia</p></BODY></HTML>" 
      $out=$Outputreport | ConvertTo-Html -Head $Outputreport
     #Send an email about the Load

        # $smtp is the outgoing mail server 
        $smtp= "smtphost.redmond.corp.microsoft.com"

        try{
        send-mailmessage -SmtpServer $smtp -from v-rubhat@microsoft.com -to v-rubhat@microsoft.com,v-ketr@microsoft.com  -subject "Retail Servers Health Report"  -BodyAsHtml "$out" 
        }
        catch [exception]
        {
        write-host ("Cannot send mail, since argument is null or empty")
        }


    }

Пожалуйста, предложите мне, если какие-либо изменения требуются в каком-либо команды.

1 Ответ

0 голосов
/ 04 февраля 2020

Это должно дать вам представление о том, как запускать задания в фоновом режиме и проверять в течение 30 минут. Если в какой-то момент процессор, память или диск превысили три, отправьте электронное письмо.

function SendEmail {
  param($server, $cpu, $mem, $disk) 

  #Code goes here to send email
}

$cpuThreshold = 99
$memThreshold = 99
$diskThreshold = 100

$jobHash = @{}
$serverHash = @{}

$serverList = @("localhost")

foreach($server in $serverList) {
    $cpu = Start-Job -ComputerName $server  -ScriptBlock { Get-Counter "\processor(_Total)\% Processor Time" -Continuous }
    $mem = Start-Job -ComputerName $server -ScriptBlock { Get-Counter -Counter "\Processor(_Total)\% Processor Time" -Continuous }
    $disk = Start-Job -ComputerName $server -ScriptBlock { Get-Counter -Counter "\LogicalDisk(C:)\% Free Space" -Continuous }

    $serverHash.Add("cpu", $cpu)
    $serverHash.Add("mem", $mem)
    $serverHash.Add("disk", $disk)

    $jobHash.Add($server, $serverHash)
}

Start-Sleep 10
$totalLoops = 0

while ($totalLoops -le 360) {

    foreach($server in $jobHash.Keys) {
        $cpu = (Receive-Job $jobHash[$server].cpu | % { (($_.readings.split(':'))[1]).Replace("`n","") } | measure -Maximum).Maximum
        $mem = (Receive-Job $jobHash[$server].mem | % { (($_.readings.split(':'))[1]).Replace("`n","") } | measure -Maximum).Maximum
        $disk = (Receive-Job $jobHash[$server].disk | % { (($_.readings.split(':'))[2]).Replace("`n","") } | measure -Maximum).Maximum

        if ($Cpu -gt $cpuThreshold -or $mem -gt $memThreshold -or $disk -gt $diskThreshold) {
            Send-Email $server $cpu $mem $disk
        }
        Write-Output "CPU: $($cpu), Mem: $($mem), disk util: $($disk)"
    }
    Start-Sleep 1
    $totalLoops ++
}

Get-Job | Remove-Job

Надеемся, что это ответ на вопрос о том, как создавать задания в фоновом режиме для проверки состояния.

Однако я бы проверил максимальное количество заданий, которые вы можете выполнять в любой момент времени.

Документация по Get-Counter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...