PowerShell 如何自动重启服务?

3

当CPU使用率达到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

你/脚本是否有停止和启动服务的权限?在计划任务中,你需要使用任何凭据吗? - I.T Delinquent
是的,我有权限和凭据。我正在使用管理员帐户,但仍然无法工作。@I.TDelinquent - William Kendly
服务可以停止吗?您的自定义消息是否已写入事件日志? - Moerwald
服务正在运行,大部分时间CPU使用率达到95%,因为这个服务。当服务的CPU使用率降至80%时,我希望能够自动重新启动。我已经检查了所有地方,但找不到日志。 @I.TDelinquent - William Kendly
1个回答

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接