Como configurar um processo de serviço do Windows para ser executado com baixa prioridade?


16

Existe uma maneira de configurar um processo de serviço do Windows (por exemplo, squidNT, SQL Server, etc) para iniciar automaticamente com baixa prioridade sem alterar manualmente a prioridade do processo através do Gerenciador de tarefas?


Alterar a prioridade de threads ou processos geralmente é uma má ideia, a menos que o código tenha sido escrito para ser executado em uma prioridade diferente. A alteração de prioridades adiciona "inversão de prioridade" à lista de problemas de simultaneidade a serem evitados.
Richard

1
O OP não perguntou se era uma boa ideia ou não. O OP perguntou se isso poderia ser feito e como . - Lembre-se de permanecer no tópico. Brain
BrainSlugs83

Respostas:


11

O Service Control Manager, que lida com a inicialização / interrupção dos serviços, não possui nenhum mecanismo (em nenhuma versão do Windows até agora) para especificar a prioridade nos processos que ele inicia.

Como você pode modificar a prioridade em um processo já em execução, sua melhor aposta pode ser usar uma ferramenta para fazer isso.

Não conheço uma ferramenta de linha de comando da Microsoft para modificar a prioridade do processo, mas a linha de comando "PV" também disponível em http://www.teamcti.com/pview/prcview.htm tem uma função para definir a prioridade .

pv -pb process-name.exe

Isso definiria "process-name.exe" como prioridade "Abaixo do normal".

Se você pode conviver com o processo iniciando com a prioridade "Normal" até alterá-lo, poderá fazê-lo com um script em execução como uma "Tarefa agendada" para disparar de vez em quando (caso o serviço seja interrompido) saltou).

É um hack rápido e sujo, mas devo muito da minha vida na vida a hacks sujos e rápidos que fazem o trabalho!


Talvez execute um arquivo em lotes para iniciar o aplicativo e, em seguida, defina a prioridade do processo, com um breve intervalo entre elas, em vez de executar o aplicativo diretamente e depois executar outra tarefa para definir a prioridade. Não vai funcionar para tudo, mas vale a pena tentar.
John Gardeniers 21/09/09

3

As respostas acima não funcionaram para mim. Acabei de criar o seguinte script do PowerShell:

ChangePriority.ps1

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

E então criei uma tarefa agendada que a chamava a cada 5 minutos. No prompt do administrador ou no script em lote:

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

Tentativa de usar wmiccomo discutido aqui para fazer com que a tarefa agendada não dependa do arquivo falhou. Similar ao uso do script powershell: não pude apenas criar um único comando que apenas criava uma tarefa com o script embutido. Apreciado se você conseguiu fazer isso e adicione outra resposta.

Valores para prioridade no script do PowerShell podem ser encontrados aqui [1].

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


Muito útil. Eu criei uma linha com minhas péssimas habilidades em ps para definir o serviço de áudio que contém o processo do host de serviço em tempo real, para evitar rachaduras no áudio durante o uso pesado da CPU (drivers ruins, eu acho). Funciona bem!
JasonXA

@JasonXA De nada. Apreciada, se você pode fornecer uma versão de uma linha dele, que eu não podia
ceztko

Claro: 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)}}" Eu não sei o quão certo é ... mas funciona. Eu não consegui fazê-lo funcionar oculto, pode funcionar apenas sob o usuário w / admin priv.
JasonXA

1

O seguinte também pode funcionar. Edite a chave do Registro ImagePath e use o comando start do cmd.exe:

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

Infelizmente, isso não funciona, pois o executável iniciado ImagePathdeve respeitar a interface dos serviços do Windows e startnão é implementado, nem o encaminhará para o executável iniciado.
precisa saber é o seguinte

0

Eu tive que fazer isso para fazer com que a teamcity levasse menos CPU. E, como o teamcity é o único aplicativo java que estamos executando, essa solução funciona perfeitamente.

  1. Defina o serviço como inicialização "manual".
  2. Crie um arquivo em lote, que iniciará seu serviço e diminuirá a prioridade, como:

    net start tcbuildagent
    net start teamcity
    wmic processo em que name = "java.exe" CHAMADA setpriority "abaixo do normal"

  3. Crie um trabalho "agendador de tarefas", acionado na "inicialização do Windows", que iniciará esse arquivo em lotes.

Configurei o gatilho TaskScheduler com um atraso de 1 minuto, para não interferir na inicialização de outros serviços.

ps, você também pode definir todas as suas inicialização de serviços como manuais e usar esse arquivo em lotes para iniciá-las na ordem desejada! SQL, IIS, etc.


0

Você pode o seguinte script do PowerShell, colocá-lo em uma tarefa agendada que é executada na inicialização.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.