低優先度で実行するようにWindowsサービスプロセスを構成する方法


16

タスクマネージャを使用してプロセスの優先度を手動で変更せずに、低い優先度で自動的に開始するようにWindowsサービスプロセス(たとえばsquidNT、SQL Serverなど)を構成する方法はありますか?


スレッドまたはプロセスの優先度を変更することは、コードが別の優先度で実行されるように書かれていない限り、通常は悪い考えです。優先順位を変更すると、回避する同時実行の問題のリストに「優先順位の逆転」が追加されます。
リチャード

1
OPは、それが良いアイデアかどうかを尋ねませんでした。OPは尋ねたならば、それを行うことができ、そしてどのように。-話題にとどまることを忘れないでください。😉
BrainSlugs83

回答:


11

サービスの開始/停止を処理するサービスコントロールマネージャーには、開始するプロセスの優先順位を指定するメカニズムがありません(これまでのWindowsのどのバージョンでも)。

すでに実行中のプロセスの優先順位を変更できるため、最善の策はツールを使用することです。

プロセスの優先度を変更するマイクロソフトのコマンドラインツールは知りませんが、http://www.teamcti.com/pview/prcview.htmで利用可能な「PV」コマンドラインにも優先度を設定する機能があります。

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


非常に便利。私は、貧弱なpsスキルで一線を切り、サービスホストプロセスを含むオーディオサービスをリアルタイムに設定して、CPU使用率が高い場合のオーディオのパチパチ音を防ぎます(悪いドライバーだと思います)。よく働く!
JasonXA

@JasonXAどういたしまして。あなたがそれの1行バージョンを提供できれば感謝します。それはできませんでした
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コマンドを使用します。

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

残念ながら、起動された実行可能ファイルImagePathはWindowsサービスのインターフェイスを尊重する必要があるため、これはまったく機能しません。また、実行されている実行可能ファイルにstart実装もルーティングもされません。
ceztko

0

teamcityのCPU使用量を減らすために、それをしなければなりませんでした。また、teamcityが実行している唯一のJavaアプリであるため、このソリューションは完全に機能します。

  1. サービスをスタートアップ「手動」として設定します。
  2. サービスを開始するバッチファイルを作成し、次のように優先度を下げます。

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

  3. 「windows startup」でトリガーされる「task scheduler」ジョブを作成し、そのバッチファイルを起動します。

TaskSchedulerトリガーを1分の遅延で構成し、他のサービスの開始を妨げないようにしました。

psまた、すべてのサービスのスタートアップを手動として設定し、そのバッチファイルを使用して、必要な順序ですべてのサービスを開始することもできます。SQL、IISなど


0

次のpowershellスクリプトを使用して、起動時に実行されるスケジュールされたタスクに配置できます。

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.