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.
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 }
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*
(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