¿Cómo configurar un proceso de servicio de Windows para que se ejecute con baja prioridad?

17

¿Hay alguna forma de configurar un proceso de servicio de Windows (por ejemplo, squidNT, SQL Server, etc.) para que se inicie automáticamente con baja prioridad sin cambiar manualmente la prioridad del proceso a través del Administrador de tareas?

owlsprt
fuente
Cambiar la prioridad de subprocesos o procesos suele ser una mala idea, a menos que el código se haya escrito para ejecutarse con una prioridad diferente. El cambio de prioridades agrega "inversión de prioridad" a la lista de problemas de concurrencia a evitar.
Richard
1
El OP no preguntó si era una buena idea o no. El OP preguntó si podría hacerse y cómo . - Recuerda mantenerte en el tema. 😉
BrainSlugs83

Respuestas:

11

El Administrador de control de servicios, que se encarga de iniciar / detener servicios, no tiene ningún mecanismo (en ninguna versión de Windows hasta ahora) para especificar la prioridad en los procesos que inicia.

Dado que puede modificar la prioridad en un proceso que ya se está ejecutando, su mejor opción podría ser utilizar una herramienta para hacerlo.

No conozco una herramienta de línea de comandos de Microsoft para modificar la prioridad del proceso, pero la línea de comandos "PV", también disponible en http://www.teamcti.com/pview/prcview.htm tiene una función para establecer la prioridad .

pv -pb process-name.exe

Eso establecería "process-name.exe" en la prioridad "Por debajo de lo normal".

Si puede vivir con el proceso que comienza con la prioridad "Normal" hasta que pueda cambiarlo, puede hacerlo con un script que se ejecuta como una "Tarea programada" para disparar cada cierto tiempo (en caso de que el servicio se ponga rebotado).

Es un truco rápido y sucio, pero le debo mucho de mi fortuna a trucos rápidos y sucios que hacen el trabajo.

Evan Anderson
fuente
Tal vez ejecute un archivo por lotes para iniciar la aplicación y luego establezca la prioridad del proceso, tal vez con un breve descanso en medio, en lugar de ejecutar la aplicación directamente y luego ejecutar otra tarea para establecer la prioridad. No funcionará para todo, pero vale la pena intentarlo.
John Gardeniers
3

Las respuestas anteriores no funcionaron para mí. Terminé de crear el siguiente script de PowerShell:

ChangePriority.ps1

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

Y luego creé una tarea programada que la llamaba cada 5 minutos. Desde el indicador del administrador o secuencia de comandos por lotes:

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

Intenté usar wmiccomo se describe aquí para hacer que la tarea programada no dependa del archivo fallida. De forma similar al uso del script de PowerShell: no pude crear un solo comando que solo crea una tarea con el script en línea. Aprecio si lograste hacerlo y agregaste otra respuesta.

Los valores de prioridad en el script de PowerShell se pueden encontrar aquí [1].

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

ceztko
fuente
Muy útil. Corté una línea con mis pobres habilidades ps para configurar el servicio de audio que contiene el proceso del host del servicio en tiempo real para evitar el crujido de audio durante el uso intensivo de la CPU (supongo que los controladores malos ¡Funciona genial!
JasonXA
@JasonXA De nada. Apreciado si puede proporcionar una versión de una línea, que no pude
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)}}" No sé qué tan correcto es ... pero funciona. No he logrado hacer que funcione oculto, solo puede funcionar bajo el usuario w / admin priv.
JasonXA
1

Lo siguiente también podría funcionar. Edite la clave de registro de ImagePath y use el comando de inicio de cmd.exe:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]
HopelessN00b
fuente
Desafortunadamente, esto no funciona en absoluto, ya que el ejecutable lanzado ImagePathdebe respetar la interfaz para los servicios de Windows, y startno se implementa ni lo enrutará al ejecutable que se está iniciando.
ceztko
0

Tuve que hacer eso para que Teamcity tomara menos CPU. Y, dado que teamcity es la única aplicación de Java que estamos ejecutando, esa solución funciona perfectamente.

  1. Establecer el servicio como inicio "manual".
  2. Cree un archivo por lotes, que comenzará su servicio, y reducirá la prioridad, como:

    net start tcbuildagent proceso de wmic teamcity
    net start
    donde name = "java.exe" CALL setpriority "debajo de lo normal"

  3. Cree un trabajo de "programador de tareas", activado en "inicio de Windows", que iniciará ese archivo por lotes.

Configuré el activador TaskScheduler con un retraso de 1 minuto, para no interferir con el inicio de otros servicios.

PD: ¡también puede configurar todos los servicios de inicio como manuales, y usar ese archivo por lotes para iniciarlos todos en el orden que desee! SQL, IIS, etc.

Foxontherock
fuente
0

Puede utilizar el siguiente script de PowerShell, ponerlo en una tarea programada que se ejecute al inicio.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Doug
fuente