web-dev-qa-db-ja.com

IIS AppPool Worker Process IDを取得する方法

監視サービスがWebサイトのダウンを検出したときに自動的に実行されるPowerShellスクリプトがあります。 AppPoolを停止し(Stop-WebAppPool -name $AppPool;を使用)、実際に停止するまで待ってから再起動することになっています。

時々それはプロセスが実際には停止せず、エラーによって明らかにされます

Cannot Start Application Pool:  
The service cannot accept control messages at this time.
(Exception from HRESULT: 0x80070425)"

もう一度起動しようとしたとき。

停止するのに特定の秒数よりも長い時間がかかる場合(通常はどれくらいかかるかを確認するために数回停止した後、その時間を選択します)、プロセスを強制終了します。

dir IIS:\AppPools\MyAppPool\WorkerProcesses\を実行することで、AppPoolのワーカーが使用するプロセスのリストを取得できることを知っています。

Process ID  State      Handles  Start Time
----------  -----      -------  ----------
7124        Running

しかし、プロセスIDを実際にキャプチャして強制終了する方法を理解できません。

23
yakatz

プロセスIDが本当に強制終了するプロセスのIDである場合、次のことができます。

$id = dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | Select-Object -expand processId
Stop-Process -id $id

または

dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | % { Stop-Process -id $_.processId }
32
stej

サーバーのコマンドプロンプトで、実行中のAppPool PIDのリストに対して次の操作を行うだけで、taskkillまたはTask Mgrを使用してそれらを強制終了できます。

cd c:\windows\system32\inetsrv
appcmd list wp
taskkill /f /pid *PIDhere*
12
PandaCookie

(おそらくStejのソリューションにキャッシュの問題があるため、Romanのコメントからの回答を追加します)

Webサーバーで管理者としてPowershellを開き、次のコマンドを実行します。

gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | select AppPoolName,ProcessId 

次のようなものが表示されます。

AppPoolName ProcessId
----------- ---------
AppPool_1        8020
AppPool_2        8568

次に、タスクマネージャを使用して強制終了するか、Powershellで使用します。

Stop-Process -Id xxxx

Get-WmiObject:名前空間root/WebAdministrationからオブジェクトを取得できませんでした。無効な名前空間を取得した場合、次を使用してIIS管理スクリプトおよびツール機能を有効にする必要があります。

ipmo ServerManager
Add-WindowsFeature Web-Scripting-Tools
8
Greg Bray