Как настроить процесс службы Windows для запуска с низким приоритетом?

17

Есть ли способ настроить процесс службы Windows (например, squidNT, SQL Server и т. Д.) Для автоматического запуска с низким приоритетом без изменения приоритета процесса вручную с помощью диспетчера задач?

owlsprt
источник
Изменение приоритета потоков или процессов обычно является плохой идеей, если только код не был написан для запуска с другим приоритетом. Изменение приоритетов добавляет «инверсию приоритетов» в список проблем параллелизма, которых следует избегать.
Ричард
1
ОП не спрашивал, была ли это хорошая идея или нет. ОП спросила, можно ли это сделать и как . - Пожалуйста, не забудьте остаться в теме. Bra
BrainSlugs83

Ответы:

11

Диспетчер управления службами, который управляет запуском / остановкой служб, не имеет какого-либо механизма (до сих пор ни в одной версии Windows) для указания приоритета запускаемых процессов.

Поскольку вы можете изменить приоритет уже запущенного процесса, лучше всего использовать инструмент для этого.

Мне не известен инструмент командной строки Microsoft для изменения приоритета процесса, но в командной строке «PV», доступной по адресу http://www.teamcti.com/pview/prcview.htm, есть функция для установки приоритета. ,

pv -pb process-name.exe

Это установило бы для «process-name.exe» приоритет «Ниже нормального».

Если вы можете жить с процессом, начинающимся с «нормального» приоритета, пока не дойдете до его изменения, вы можете сделать это с помощью скрипта, выполняемого как «Запланированная задача», который запускается время от времени (в случае, если служба получает подпрыгнул).

Это быстрый и грязный хак, но я многим обязан в жизни быстрым и грязным хакерам, которые сделали свою работу!

Эван Андерсон
источник
Возможно, запустите пакетный файл, чтобы запустить приложение, а затем установите приоритет процесса, возможно, с небольшим перерывом между ними, вместо того, чтобы запускать приложение напрямую, а затем запустить другую задачу для установки приоритета. Не будет работать на все, но стоит попробовать.
Джон Гарденье
3

Приведенные выше ответы не сработали для меня. Я закончил создание следующего сценария powershell:

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как описано здесь, чтобы запланированное задание не зависело от файла, не удалось. Аналогично использованию сценария powershell: мне не удалось создать одну команду, которая просто создала бы задачу с помощью встроенного сценария. Ценится, если вам удалось сделать это и добавить еще один ответ.

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

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

ceztko
источник
Очень полезный. Я оборвал линию с моими плохими навыками 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)}}" Я не знаю, насколько это правильно ... но это работает. Мне не удалось заставить его работать скрытно, может работать только под пользователем с правами администратора.
JasonXA
1

Следующее может также работать. Отредактируйте раздел реестра ImagePath и используйте команду запуска из cmd.exe:

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]
HopelessN00b
источник
К сожалению, это не работает вообще, так как исполняемый файл ImagePathдолжен соответствовать интерфейсу служб Windows, и startне реализует, и не будет перенаправлять его на запускаемый исполняемый файл.
ceztko
0

Я должен был сделать это, чтобы заставить teamcity брать меньше процессоров. И поскольку teamcity - единственное Java-приложение, которое мы запускаем, это решение отлично работает.

  1. Установить службу как запуск "ручной".
  2. Создайте пакетный файл, который запустит ваш сервис и понизит приоритет, например:

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

  3. Создайте задание «Планировщик заданий», запускаемое при «запуске Windows», которое запустит этот пакетный файл.

Я настроил триггер TaskScheduler с задержкой в ​​1 минуту, чтобы не мешать запуску других служб.

ps вы также можете установить запуск всех ваших служб как ручной, и использовать этот командный файл для запуска всех из них в нужном вам порядке! SQL, IIS и т. Д.

foxontherock
источник
0

Вы могли бы следующий скрипт powershell, поместить его в запланированное задание, которое запускается при запуске.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Doug
источник