Essayer de démarrer le pool d'applications via le script Powershell - erreur par intermittence

19

J'ai un script batch qui me permet de désactiver un site, de déployer des fichiers et de le réactiver.

  1. Arrêter le pool d'applications - fonctionne
  2. Arrêtez le site - travaux
  3. Déployer des fichiers - travaux
  4. Démarrer le pool d'applications - ne fonctionne que parfois!
  5. Démarrer le site Web - fonctionne si les travaux précédents

J'exécute Windows Server 2012 R2 et le script de commandes est exécuté par un tentacule Octopus Deploy.

La ligne sur laquelle il échoue est:

 Start-WebAppPool -Name $appPoolName

Où $ appPoolName est live.website.com

Cette ligne fonctionne parfois mais pas les autres et n'est cohérente dans aucun modèle.

J'ai le même script travaillant sur d'autres serveurs. J'ai vérifié si le service d'informations sur les applications fonctionne et fonctionne correctement. Il n'y a pas de journaux système dans l'Observateur d'événements.

Cependant, j'ai cette seule erreur d'application qui est déclenchée lorsque le Start-WebAppPool est appelé:

ERROR  + Start-WebAppPool -Name $appPoolName
ERROR  start-webitem : The service cannot accept control messages at this time. 

Quelqu'un sait-il pourquoi cela peut se produire? J'ai essayé d'écrire une boucle do-while jusqu'à ce qu'elle soit dans un état "Démarré", mais elle fait une boucle sans succès.

Mise à jour

Il s'avère que le processus ne s'arrête pas lorsque je désactive le pool d'applications.

Pourquoi le processus continuerait-il de s'exécuter après l'arrêt du pool d'applications? Il continue littéralement à fonctionner, sans s'arrêter.

Fixé!

Donc - en suivant les commentaires ci-dessous, lorsque j'arrête le pool d'applications, je m'assure maintenant qu'il est complètement à l'état arrêté avant de continuer le script.

Voici le script que j'ai maintenant et qui fonctionne pleinement:

# Load IIS module:
Import-Module WebAdministration

# Get AppPool Name
$appPoolName = $OctopusParameters['appPoolName']

if ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
{
    Write-Host "AppPool already stopped: " + $appPoolName
}
else
{
    Write-Host "Shutting down the AppPool: " + $appPoolName
    Write-Host (Get-WebAppPoolState $appPoolName).Value

# Signal to stop.
Stop-WebAppPool -Name $appPoolName
}

do
{
    Write-Host (Get-WebAppPoolState $appPoolName).Value
    Start-Sleep -Seconds 1
}
until ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
Base33
la source
1
Il me semble que vous émettez la commande d'arrêt App Pool avec succès, mais elle n'est pas réellement arrêtée au moment où vous essayez de la redémarrer. Probablement parce que le "processus" que vous mentionnez dans votre édition le maintient dans un état en cours d'exécution (ou peut-être dans un état "arrêt"), en attendant que quelque chose se termine. Est-ce toujours le même processus qui le tient? Quel est ce processus? (Processus système, ou partie de votre application Web, ou ???). Si c'est un processus qui en dehors de votre application Web, alors pourquoi ne pas le déboguer et comprendre ce qu'il attend (le cas échéant)?
Ƭᴇcʜιᴇ007
1
En guise d'intervalle, ajoutez peut-être du code à votre script pour attendre que le pool d'applications soit réellement à l'état arrêté avant de continuer dans le script?
Ƭᴇcʜιᴇ007
2
@ Base33, pouvez-vous coller la réponse dans une réponse et marquer comme solution? Ensuite, cela n'apparaîtra plus comme "sans réponse"
HackSlash

Réponses:

1

Octopus Deploy dispose de quelques scripts PowerShell communautaires, que vous pouvez trouver ici https://library.octopus.com/listing

C'est le contenu de l'un d'entre eux, qui a des tentatives:

# Load IIS module:
Import-Module WebAdministration

# Get AppPool Name
$appPoolName = $OctopusParameters['appPoolName']
# Get the number of retries
$retries = $OctopusParameters['appPoolCheckRetries']
# Get the number of attempts
$delay = $OctopusParameters['appPoolCheckDelay']

# Check if exists
if(Test-Path IIS:\AppPools\$appPoolName) {

    # Stop App Pool if not already stopped
    if ((Get-WebAppPoolState $appPoolName).Value -ne "Stopped") {
        Write-Output "Stopping IIS app pool $appPoolName"
        Stop-WebAppPool $appPoolName

        $state = (Get-WebAppPoolState $appPoolName).Value
        $counter = 1

        # Wait for the app pool to the "Stopped" before proceeding
        do{
            $state = (Get-WebAppPoolState $appPoolName).Value
            Write-Output "$counter/$retries Waiting for IIS app pool $appPoolName to shut down completely. Current status: $state"
            $counter++
            Start-Sleep -Milliseconds $delay
        }
        while($state -ne "Stopped" -and $counter -le $retries)

        # Throw an error if the app pool is not stopped
        if($counter -gt $retries) {
            throw "Could not shut down IIS app pool $appPoolName. `nTry to increase the number of retries ($retries) or delay between attempts ($delay milliseconds)." }
    }
    else {
        Write-Output "$appPoolName already Stopped"
    }
}
else {
    Write-Output "IIS app pool $appPoolName doesn't exist"
}

Qui provient de ce modèle de bibliothèque https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

spikey_richie
la source