監視サービスが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を実際にキャプチャして強制終了する方法を理解できません。
プロセス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 }
サーバーのコマンドプロンプトで、実行中のAppPool PIDのリストに対して次の操作を行うだけで、taskkillまたはTask Mgrを使用してそれらを強制終了できます。
cd c:\windows\system32\inetsrv
appcmd list wp
taskkill /f /pid *PIDhere*
(おそらく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