PowerShell Как автоматически перезапустить службу? - PullRequest
3 голосов
/ 10 июня 2019

Я пытаюсь перезапустить конкретную службу, когда загрузка процессора достигает 80%.Я использую триггер задания и пытаюсь получить логи, но не могу перезапустить сервис.

$peridiocallyChecks = {
    # Check if logging source is available, if not add it
    if (!(Get-EventLog -Source "CPU supervision" -LogNameApplication)){    
        New-EventLog -LogName Application -Source "CPU supervision" 
    }

    #Getting CPU usage e.g 45.3434242423
    $cpuUsage = [double] (Get-Counter '\Processor(_Total)\% Processor Time' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue)

    if ($cpuUsage -gt 80) {
       Write-EventLog -LogName "Application" -Source "CPU supervision" -EntryType Information -EventId 1 -Message "CPU usage is $cpuUsage. Going to stop service"
        Stop-Service "service name"
        # Some cooldown time for the service to shutdown
        Start-Sleep -Seconds 10
        Start-Service "service name"
        Write-EventLog -LogName "Application" -Source "CPU supervision" -EntryType Information -EventId 1 -Message "Restarted service"
    }
    Get-EventLog -Source "CPU supervision" -LogName Application
}

# Trigger every hour

$trigger = New-JobTrigger -Once -At "17/05/2019 0am" -RepetitionInterval (New-TimeSpan -Hour 12) -RepetitionDuration ([TimeSpan]::MaxValue)

Register-ScheduledJob -Name "CPUCheck23" -Trigger $trigger -Scriptblock $peridiocallyChecks

1 Ответ

0 голосов
/ 15 июня 2019

Write-EventLog записывает в журнал событий Windows .Я бы запустил код, который создает источник журнала вне блока $peridiocallyChecks, который запускается с запланированной задачей.Вам нужны права администратора для создания источника журнала, и может случиться так, что он завершится с ошибкой во время запланированной задачи, и вы не получите никаких журналов / остальная часть блока скрипта не запускается.

Итак, сначала сделайте так, чтобы регистрация работала вне запланированной задачи, и создайте настраиваемое представление в средстве просмотра событий, чтобы вы могли выполнить Write-EventLog в интерактивном режиме, обновить представление и просмотреть сообщение журнала..

После того, как вы сможете просмотреть журналы без сложностей с запланированной задачей поверх них, начните работать со сценарием, чтобы найти, какая область не запущена.При необходимости добавьте больше вызовов Write-EventLog, чтобы сузить то, что вызывается, а что нет.

Get-EventLog -Source "CPU supervision" -LogName Application является избыточным.Это покажет вам сообщения журнала событий, но при запуске в запланированном задании вы ничего не увидите.

Я также использую функцию выборки Get-Counter для вычисления среднего значения по несколькимсекунд.Этот способ дает вам лучшее представление о фактической нагрузке, потому что одно наблюдение может быть ниже, чем вы ожидаете, даже если система находится под нагрузкой.

$i = 0
$runTotal = 0.0;
$counters = Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 3 -MaxSamples 5 | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue 
$counters | foreach { $runTotal = $_ + $runTotal; $i ++} 

#Raw Counter
$counters

# Mean value over 3 seconds will give you a better estimate 
$runTotal/ $i
...