web-dev-qa-db-fra.com

Comment obtenir IIS ID de processus de travail AppPool

J'ai un script PowerShell qui s'exécute automatiquement lorsque notre service de surveillance détecte qu'un site Web est en panne. Il est censé arrêter l'AppPool (en utilisant Stop-WebAppPool -name $AppPool;), attendez qu'il soit vraiment arrêté puis redémarrez-le.

Parfois, le processus ne s'arrête pas réellement, ce qui se manifeste par l'erreur

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

lorsque vous essayez de le redémarrer.

Si cela prend plus d'un certain nombre de secondes pour s'arrêter (je choisirai ce laps de temps après avoir chronométré plusieurs arrêts pour voir combien de temps cela prend habituellement), je veux simplement tuer le processus.

Je sais que je peux obtenir la liste des processus utilisés par les travailleurs de l'AppPool en faisant dir IIS:\AppPools\MyAppPool\WorkerProcesses\,

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

mais je ne peux pas comprendre comment capturer réellement l'identifiant du processus afin que je puisse le tuer.

23
yakatz

Dans le cas où cet ID de processus est vraiment l'ID du processus à tuer, vous pouvez:

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

ou

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

Dans l'invite de commandes sur le serveur, je fais juste ce qui suit pour une liste des PID AppPool en cours d'exécution afin que je puisse les tuer avec taskkill ou Task Mgr:

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

(Ajout de la réponse du commentaire de Roman, car il peut y avoir des problèmes de cache avec la solution de stej)

Ouvrez Powershell en tant qu'administrateur sur le serveur Web, puis exécutez:

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

Vous devriez voir quelque chose comme:

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

Vous pouvez ensuite utiliser le Gestionnaire des tâches pour le tuer ou en utilisation Powershell:

Stop-Process -Id xxxx

Si vous obtenez Get-WmiObject: Impossible d'obtenir des objets de la racine de l'espace de noms/WebAdministration. Espace de noms non valide alors vous devez activer la fonction IIS Management Scripts and Tools en utilisant:

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