2014-10-07 90 views
0

我已经创建了一个脚本来重新启动一个预定的时间段。不幸的是,它正在检查我遇到CPU使用问题的时间。它只是运行并运行(假设这是while循环的本质)。我正在寻找更好的方法来做到这一点。Powershell循环和优化

所以基本上我把它设置有次它会查找,例如:12:00

我再运行一段时间,并继续工作,直到它命中12:00,然后执行一些事情并运行再次到下一个时间间隔。

有趣的是,它在创建这个过程时逃脱了我的想法,认为这将是一个资源浪费,效率极低。

所以我的问题是,我应该怎么做,如果我想重新启动某些间隔的东西,但不希望它检查每秒/毫秒。

这将重新启动游戏服务器进程,并且时机至关重要,因为人们需要在游戏中发出警告。

我将包括可行性脚本。

$CurrentTime = Get-Date -UFormat "%R" 

$debug = "true" 

$Times = "12:00", "13:00", "01:00", "14:12" 
$servers = "Notepad" 
$aff = "C4", "38" 

$scriptRun = 0 
$serverCount = 1 

$startedServers 

$loop = 1 

function checkServers 
{ 
    if ($debug -eq "true") { Write-Output "Entering Loop ::: $loop" } 
    while($loop -eq 1) 
    { 

    if ($CurrentTime -eq $Times[1] -or $CurrentTime -eq $Times[2] -or $CurrentTime -eq $Times[3] -or $CurrentTime -eq $Times[4]) 
    { 
     stopServers 
     foreach($i in $servers) 
     { 
      if ($debug -eq "true") { Write-Output "The Server being started is $server" } 
      startServer([ref]$servers[$i]) 
     } 
     $loop = 0 
    } else { 
     $loop = 1 
     checkServers 
    } 
    } 
} 

function waits 
{ 
    Start-Sleep -seconds 61 
    $loop = 1 
    checkServers 
} 

function stopServers 
{ 
    if ($scriptRun -eq 1) 
    { 
     foreach ($i in $startedServers) 
     { 
      Stop-Process -processname $startedServers[$i] 
      Write-Output "$startedServers[$i] has been stopped" 
     } 
    } else { 
    Write-Output "Starting Servers for the first time" 
    } 
} 

function startServer([ref]$server) 
{ 
    $server = $server 

    Start $server 
    $s = "$server.exe" 
    $instances = Get-Process $s 

    foreach ($s in $instances) { 
     $s.ProcessAffinity = $aff[$serverCount] 
     $serverCount = $serverCount + 1 
    } 

    if ($scriptRun -eq 0) { 
     $startedServers += $s 
     $scriptRun = 1 
    } 
    waits 
    Write-Output "$server was successfully started at $CurrentTime" 
} 

Write-Output "Starting RestartServer at $CurrentTime" 
checkServers 

**是的,有可能是其他错误,我正在通过最明显的一个先工作然后将其他人。

+2

如果您只想在特定时间执行任务,为什么不使用计划任务而是在您想要的时间触发。 – 2014-10-07 18:44:58

+0

我曾希望创建一个独立于Windows任务调度器的独立脚本,但您可能是对的,因为这将是实现它的最佳方式。 – 2014-10-07 18:48:08

回答

4

只要检查不是CPU密集型的,检查每一秒都不是什么大问题。但是,当你有一个不断检查的紧密循环时 - 这是一个问题。只需放入一个Start-Sleep -sec 1或Start-Sleep -Milli 500,就可以显着减轻CPU的负担。您还可以使用预定作业在预定时间运行脚本。

+0

从技术上讲,这将工作,因为它不检查秒,我甚至可以扩展它来检查每一个说55秒,它应该仍然正确地捕捉它。不知道为什么我没有想到这一点。 – 2014-10-07 18:49:02