Як налаштувати процес обслуговування Windows для запуску з низьким пріоритетом?


17

Чи є спосіб налаштувати сервісний процес Windows (наприклад, squidNT, SQL Server тощо), щоб автоматично почати з низьким пріоритетом, не змінюючи пріоритет процесу вручну за допомогою диспетчера завдань?


Зміна пріоритету потоків або процесів зазвичай є поганою ідеєю, якщо тільки код не був написаний для виконання з іншим пріоритетом. Зміна пріоритетів додає "інверсію пріоритетів" до списку проблем паралельності, яких слід уникати.
Річард

1
ОП не запитували, чи це гарна ідея чи ні. ОП запитала, чи можна це зробити, і як . - Будь ласка, не забудьте залишитися на темі. 😉
BrainSlugs83

Відповіді:


11

Менеджер управління сервісом, який обробляє послуги запуску / зупинки, не має жодного механізму (у будь-якій версії Windows, раніше), щоб вказати пріоритет у процесах, які він починає.

Оскільки ви можете змінити пріоритет у вже запущеному процесі, найкращим варіантом може бути використання інструменту для цього.

Мені не відомий інструмент командного рядка Microsoft для зміни пріоритету процесу, але командний рядок "PV" теж доступний на веб- сайті http://www.teamcti.com/pview/prcview.htm, який має функцію встановлення пріоритету .

pv -pb process-name.exe

Це встановило б "process-name.exe" пріоритетом "Нижче звичайного".

Якщо ви можете жити з процесом, який починається з пріоритету "Нормальний", поки ви не увійдете в його зміну, ви можете зробити це зі сценарієм, який працює як "Заплановані завдання", щоб звільнити все так часто (у випадку, якщо служба отримує відскочив).

Це швидкий і брудний злом, але я багато свого життя в житті завдячую швидким і брудним хакам, які отримують роботу!


Можливо, запустіть пакетний файл, щоб запустити додаток, а потім встановити пріоритет процесу, можливо, короткий сон між ними, а не запуск програми безпосередньо, а потім виконання іншої задачі для встановлення пріоритету. Не вийде на все, але варто спробувати.
Джон Гарденєр

3

Наведені вище відповіді не працювали для мене. Я закінчив створення наступного сценарію повноважень:

ChangePriority.ps1

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

А потім я створив планове завдання, яке дзвонять кожні 5 хвилин. З запиту адміністратора або пакетного сценарію:

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

Спроба використовувати, wmicяк обговорювалося тут, для того, щоб зробити заплановане завдання, не залежно від файлу, не вдалося. Подібний сценарій за допомогою скрипта повноважень: мені не вдалося створити єдину команду, яка просто створила завдання з вбудованим сценарієм. Вдячний, якщо вам вдалося це зробити і додати ще одну відповідь.

Значення пріоритету в скрипті повноважень можна знайти тут [1].

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


Дуже корисний. Я порушив лінійку з моїми поганими навичками PS, щоб встановити аудіо-сервіс, що містить процес хосту сервісу, в режимі реального часу, щоб запобігти потріскуванню звуку під час великого використання процесора (я думаю, погані драйвери). Чудово працює!
JasonXA

@JasonXA Вітаємо вас.
ceztko

Звичайно: 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)}}" Я не знаю, наскільки це правильно ... але це працює. Мені не вдалося змусити його працювати приховано, він може працювати лише під користувачем w / admin priv.
JasonXA

1

Наступне також може спрацювати. Відредагуйте ключ реєстру ImagePath і скористайтеся командою start від cmd.exe:

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

На жаль, це зовсім не працює, оскільки запущений виконуваний файл ImagePathповинен відповідати інтерфейсу для служб Windows, а startтакож не реалізовувати і не спрямовувати це до запущеного виконуваного файлу.
чецько

0

Мені довелося це зробити, щоб згуртувати менше процесора. І, оскільки teamcity - єдиний додаток Java, який ми запускаємо, це рішення працює чудово.

  1. Встановіть послугу як "керівництво по запуску".
  2. Створіть пакетний файл, який запустить вашу послугу, і зменшіть пріоритет, наприклад:

    net start tcbuildagent
    net start teamcity
    wmic процес, де name = "java.exe" CALL setpriority "нижче норми"

  3. Створіть завдання "планувальник завдань", запущене при запуску Windows, що запустить цей пакетний файл.

Я налаштував тригер TaskScheduler із затримкою на 1 хвилину, щоб не перешкоджати запуску інших служб.

ps Ви також можете встановити всі ваші сервісні запуски як ручні та використовувати цей пакетний файл, щоб запустити їх у потрібному порядку! SQL, IIS тощо.


0

Ви можете наступний скрипт повноважень, помістити його в заплановане завдання, яке працює при запуску.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.