Programmi käivitamine teise prioriteediga

Vahel on vaja, et saaks käivitada programmi madalama prioriteediga, kui muud programmid.  Vahel jälle on vaja käivitatud programmi prioriteeti tõsta.

Üks lihtne võimalus seda graafilises liideses, on Task Manageri abil.  Sellel on vaid üks puudus: nimelt tuleb programm kõigepealt käima panna.  Aga tavaliselt on selliseid asju vaja teha juba programmi käivitades.  Ja siis graafilisest liidesest kasu pole.

Lihtne on programmi prioriteeti muuta käsurealt, CMD.EXE seest käsuga START.  Näiteks saab programmi notepad.exe käivitada madalama prioriteediga:

start /belownormal notepad.exe

aga kui sama asja tahaks teha otseteega töölaualt, või käsurealt, siis peaks kirjutama hoopis:

cmd /c start /belownormal notepad.exe

Tuleb ainult meeles pidada, et  prioriteeti RealTime saab määrata ainult süsteemiülema õigustes isik.  Kui kasutajal süsteemiülema õigusi pole, siis saadakse tulemuseks prioriteet High.

Aga kui meil oleks vaja sama teha mitte käsitsi, vaid automaatselt?  Ja eesmärgiks oleks näiteks võtta hetkel liiga palju protsessori aega kulutav protsess ning seda korrale kutsuda?

CMD.EXE sai ilusti hakkama protsessi käivitamisel prioriteedi määramisega.  Ent juba töötava protsessi prioriteedi muutmisel jääb ta hätta.  Vaja läheb kolmanda partei utiliite, nagu näiteks SetPriority.  Või siis tuleb ära õppida WMI kasutamine otse käsurealt käsuga WMIC:

wmic process where name="notepad.exe" call setpriority "idle"

Windows Scripting Host saab asjaga paremini hakkama.  Tuleb küll kasutada WMI liidest, ent võimalus on olemas ning järgmine näidis on pärit TechNet Scripting Guide’ist:

Const ABOVE_NORMAL = 32768

strComputer = “.”
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” _
    & strComputer & “\root\cimv2“)
Set objStartup = objWMIService.Get(“Win32_ProcessStartup“)

Set objConfig = objStartup.SpawnInstance_
objConfig.PriorityClass = ABOVE_NORMAL

Set objProcess = GetObject(“winmgmts:root\cimv2:Win32_Process“)
objProcess.Create “Notepad.exe”, Null, objConfig, intProcessID

Ülaltoodud näide käivitab uue protsessi.  Järgnev näide muudab olemasoleva protsessi prioriteeti:

Const BELOW_NORMAL = 16384

strComputer = “.”
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” _
    & strComputer & “\root\cimv2“)

Set colProcesses = objWMIService.ExecQuery_
    (“Select * from Win32_Process Where Name = ‘Notepad.exe’”)

For Each objProcess in colProcesses
    objProcess.SetPriority(BELOW_NORMAL)
Next

Proovime nüüd sama asja PowerShellis.  Kõigepealt uue protsessi käivitamine:

#requires –Version 2.0
(Start-Process notepad.exe -PassThru).PriorityClass = "Idle"

Palju parem.  Aga nüüd näide sellest, kuidas muuta olemasoleva protsessi prioriteeti:

Get-Process notepad |
    ForEach-Object {$_.PriorityClass = "BelowNormal"}

Kui me tahame muuta prioriteeti protsessil, mida me ise ei ole käivitanud, siis on vaja omandada veel süsteemiülema õigused.  Aga seda sai kirjeldatud juba ühes varasemas artiklis.

Üks pisiasi veel.  Kui tahad teada kõiki prioriteediklasside nimesid, siis need annab järgmine näide:

[System.Enum]::GetValues([System.Diagnostics.ProcessPriorityClass])
Advertisements