2014-10-07 6 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

특정 시간에만 작업을 실행하려는 경우 예약 된 작업을 사용하여 원하는 시간에 트리거하지 않는 것이 좋습니다. –

+0

Windows 작업 스케줄러와 별개의 독립 실행 형 스크립트를 만들려고했지만 이것이 가장 좋은 방법 일 것입니다. –

답변

4

수표가 CPU를 많이 사용하지 않는 한 매초 확인하는 것은 그리 중요하지 않습니다. 그러나 끊임없이 점검하고있는 빡빡한 루프가있을 때 그것은 문제입니다. Start-Sleep -sec 1 또는 Start-Sleep -Milli 500을 넣으면 CPU의 부하를 대폭 줄여야합니다. 예약 된 작업을 사용하여 미리 결정된 시간에 스크립트를 실행할 수도 있습니다.

+0

기술적으로 이것은 초를 점검하지 않기 때문에 작동 할 것입니다. 심지어는 매 55 초마다 점검하도록 확장 할 수 있으며 올바르게 잡아야합니다. 왜 내가 이것을 생각하지 않았는지 모르겠다. –