Comment configurer un processus de service Windows pour qu'il s'exécute avec une faible priorité?

17

Existe-t-il un moyen de configurer un processus de service Windows (par exemple squidNT, SQL Server, etc.) pour démarrer automatiquement avec une faible priorité sans modifier manuellement la priorité du processus via le Gestionnaire des tâches?

owlsprt
la source
Changer la priorité des threads ou des processus est généralement une mauvaise idée, sauf si le code a été écrit pour s'exécuter avec une priorité différente. La modification des priorités ajoute "l'inversion de priorité" à la liste des problèmes de concurrence à éviter.
Richard
1
Le PO n'a pas demandé si c'était une bonne idée ou non. Le PO a demandé si cela pouvait être fait et comment . - N'oubliez pas de rester sur le sujet. 😉
BrainSlugs83

Réponses:

11

Le Gestionnaire de contrôle des services, qui gère le démarrage / l'arrêt des services, ne dispose d'aucun mécanisme (dans aucune version de Windows jusqu'à présent) pour spécifier la priorité des processus qu'il démarre.

Étant donné que vous pouvez modifier la priorité sur un processus déjà en cours d'exécution, votre meilleur pari pourrait être d'utiliser un outil pour le faire.

Je ne connais pas d'outil de ligne de commande Microsoft pour modifier la priorité du processus, mais la ligne de commande "PV" aussi, disponible sur http://www.teamcti.com/pview/prcview.htm a une fonction pour définir la priorité .

pv -pb process-name.exe

Cela donnerait à "process-name.exe" la priorité "Inférieur à la normale".

Si vous pouvez vivre avec le processus commençant à la priorité "Normal" jusqu'à ce que vous soyez prêt à le modifier, vous pouvez le faire avec un script exécuté en tant que "Tâche planifiée" pour se déclencher de temps en temps (dans le cas où le service obtient rebondi).

C'est un hack rapide et sale, mais je dois beaucoup de ma fortune dans la vie à des hacks rapides et sales qui font le travail!

Evan Anderson
la source
Peut-être exécutez un fichier batch pour démarrer l'application, puis définissez la priorité du processus, avec peut-être un court délai entre les deux, plutôt que d'exécuter l'application directement, puis d'exécuter une autre tâche pour définir la priorité. Ne fonctionnera pas pour tout, mais en vaut la peine.
John Gardeniers
3

Les réponses ci-dessus n'ont pas fonctionné pour moi. J'ai fini de créer le script PowerShell suivant:

ChangePriority.ps1

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

Et puis j'ai créé une tâche planifiée qui l'appelle toutes les 5 minutes. À partir de l' invite de l' administrateur ou du script batch:

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

Vous avez tenté d'utiliser wmiccomme indiqué ici pour que la tâche planifiée ne dépende pas du fichier a échoué. Similaire à l'aide du script powershell: je ne pouvais pas simplement créer une seule commande qui créait simplement une tâche avec le script en ligne. Apprécié si vous avez réussi à le faire et à ajouter une autre réponse.

Les valeurs de priorité dans le script powershell peuvent être trouvées ici [1].

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

ceztko
la source
Très utile. J'ai découpé une ligne avec mes faibles compétences ps pour définir le service hôte contenant le processus hôte de service en temps réel pour empêcher le craquement audio lors d'une utilisation intensive du processeur (mauvais pilotes, je suppose). Fonctionne très bien!
JasonXA
@JasonXA Vous êtes les bienvenus. Apprécié si vous pouvez en fournir une version en une seule ligne, ce que je ne pouvais pas
ceztko
Bien sûr: 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)}}" Je ne sais pas à quel point c'est correct ... mais cela fonctionne. Je n'ai pas réussi à le faire fonctionner caché, ne peut fonctionner que sous user w / admin priv.
JasonXA
1

Les éléments suivants pourraient également fonctionner. Modifiez la clé de registre ImagePath et utilisez la commande de démarrage de cmd.exe:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]
HopelessN00b
la source
Malheureusement, cela ne fonctionne pas du tout car l'exécutable lancé dans ImagePathdoit respecter l'interface pour les services Windows, et startne l'implémente pas et ne le routera pas vers l'exécutable en cours de lancement.
ceztko
0

J'ai dû faire ça pour que Teamcity prenne moins de CPU. Et, comme teamcity est la seule application java que nous utilisons, cette solution fonctionne parfaitement.

  1. Définissez le service comme "manuel" de démarrage.
  2. Créez un fichier de commandes, qui démarrera votre service et diminuera la priorité, comme:

    net start tcbuildagent
    net start teamcity
    wmic process where name = "java.exe" CALL setpriority "below normal"

  3. Créez un travail de "planificateur de tâches", déclenché au "démarrage de Windows", qui lancera ce fichier de commandes.

J'ai configuré le déclencheur TaskScheduler avec un délai d'une minute pour ne pas interférer avec le démarrage d'autres services.

ps vous pouvez également définir tous les services de démarrage comme manuels, et utiliser ce fichier batch pour les démarrer tous dans l'ordre que vous souhaitez! SQL, IIS, etc.

Foxontherock
la source
0

Vous pouvez utiliser le script powershell suivant, le placer dans une tâche planifiée qui s'exécute au démarrage.

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