Come configurare un processo di servizio di Windows per l'esecuzione con priorità bassa?


17

Esiste un modo per configurare un processo del servizio Windows (ad esempio squidNT, SQL Server, ecc.) Per l'avvio automatico con priorità bassa senza modificare manualmente la priorità del processo tramite Task Manager?


Modificare la priorità di thread o processi è di solito una cattiva idea, a meno che il codice non sia stato scritto per essere eseguito con una priorità diversa. La modifica delle priorità aggiunge "inversione di priorità" all'elenco dei problemi di concorrenza da evitare.
Richard,

1
L'OP non ha chiesto se fosse una buona idea o meno. L'OP ha chiesto se potesse essere fatto e come . - Ricordati di rimanere in tema. 😉
BrainSlugs83

Risposte:


11

Service Control Manager, che gestisce i servizi di avvio / arresto, non ha alcun meccanismo (in nessuna versione di Windows finora) per specificare la priorità sui processi che avvia.

Dal momento che è possibile modificare la priorità su un processo già in esecuzione, la soluzione migliore potrebbe essere quella di utilizzare uno strumento per farlo.

Non sono a conoscenza di uno strumento da riga di comando Microsoft per modificare la priorità del processo, ma anche la riga di comando "PV", disponibile su http://www.teamcti.com/pview/prcview.htm ha una funzione per impostare la priorità .

pv -pb process-name.exe

Ciò imposterebbe "process-name.exe" sulla priorità "Sotto il normale".

Se riesci a convivere con il processo che inizia con la priorità "Normale" fino a quando non riesci a cambiarlo, puoi farlo con uno script in esecuzione come "Attività pianificata" per attivarlo ogni tanto (nel caso in cui il servizio venga rimbalzato).

È un trucco rapido e sporco, ma devo molta della mia fortuna nella vita a hack rapidi e sporchi che fanno il lavoro!


Magari esegui un file batch per avviare l'app e quindi impostare la priorità del processo, con forse un breve intervallo di tempo, anziché eseguire direttamente l'app e quindi eseguire un'altra attività per impostare la priorità. Non funzionerà per tutto ma vale la pena provare.
John Gardeniers,

3

Le risposte sopra non hanno funzionato per me. Ho finito di creare il seguente script PowerShell:

ChangePriority.ps1

Get-WmiObject Win32_process -Filter 'name="ProcessName.exe"' | ForEach-Object {$_.SetPriority(128)}

E poi ho creato un'attività pianificata che la chiama ogni 5 minuti. Dal prompt dell'amministratore o dallo script batch:

schtasks /Create /tn "Process Priority Change" /sc MINUTE /mo 5 /ru SYSTEM /tr "powershell -noprofile -executionpolicy bypass -file \"%cd%\ChangePriority.ps1\""

Tentativo di utilizzare wmiccome discusso qui per rendere l'attività pianificata non dipendente dal file non riuscita. Simile usando lo script PowerShell: non ero in grado di creare un singolo comando che creasse semplicemente un'attività con lo script incorporato. Apprezzato se sei riuscito a farlo e aggiungi un'altra risposta.

I valori di priorità nello script PowerShell sono disponibili qui [1].

[1] https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/setpriority-method-in-class-win32-process


Molto utile. Ho troncato una linea con le mie scarse abilità ps per impostare il servizio audio contenente il processo dell'host di servizio in tempo reale per prevenire il crepitio dell'audio durante l'uso intenso della CPU (driver difettosi, immagino). Funziona alla grande!
JasonXA,

@JasonXA Prego. Apprezzato se riesci a fornirne una versione a una riga, cosa che non potrei
ceztko

Sicuro: PowerShell.exe -noprofile -executionpolicy bypass -command "& {Get-WmiObject Win32_service -Filter \" Name = 'AudioSrv' \ "| ForEach {Get-WmiObject Win32_process -Filter \" ProcessId = $ ($ _. ProcessId) \ "} | ForEach-Object {$ _. SetPriority (256)}}" Non so quanto sia giusto ... ma funziona. Non sono riuscito a farlo funzionare nascosto, posso funzionare solo con l'utente w / admin priv.
JasonXA,

1

Di seguito potrebbe anche funzionare. Modifica la chiave di registro di ImagePath e usa il comando start da cmd.exe:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]

Sfortunatamente questo non funziona affatto poiché l'eseguibile avviato ImagePathdeve rispettare l'interfaccia per i servizi di Windows e startnon implementare né indirizzare questo all'eseguibile avviato.
ceztko,

0

Ho dovuto farlo per far sì che teamcity richiedesse meno CPU. E poiché teamcity è l'unica app java in esecuzione, quella soluzione funziona perfettamente.

  1. Impostare il servizio come "manuale" di avvio.
  2. Crea un file batch, che avvierà il tuo servizio e ridurrà la priorità, come:

    net start tcbuildagent
    net start teamcity
    processo wmic dove name = "java.exe" CALL setpriority "below normal"

  3. Creare un processo "Utilità di pianificazione", attivato all'avvio di Windows, che avvierà quel file batch.

Ho configurato il trigger TaskScheduler con un ritardo di 1 minuto, per non interferire con l'avvio di altri servizi.

ps puoi anche impostare l'avvio di tutti i tuoi servizi come manuale e utilizzare quel file batch per avviarli tutti nell'ordine desiderato! SQL, IIS, ecc.


0

È possibile il seguente script PowerShell, inserirlo in un'attività pianificata che viene eseguita all'avvio.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.