Tentativo di avviare il pool di app tramite Powershell Script - errore intermittente


19

Ho uno script batch che mi consente di disattivare un sito, distribuire file e riaccendere il sito.

  1. Arresta il pool di applicazioni: funziona
  2. Ferma il sito web - funziona
  3. Distribuisci file: funziona
  4. Avvia pool di applicazioni: funziona solo a volte!
  5. Avvia il sito Web: funziona se funziona in precedenza

Sto eseguendo Windows Server 2012 R2 e lo script batch viene eseguito da un tentacolo di Octopus Deploy.

La linea su cui sta fallendo è:

 Start-WebAppPool -Name $appPoolName

Dove $ appPoolName è live.website.com

Questa linea funziona a volte ma non in altri, e non è coerente in alcun modello.

Ho lo stesso script che funziona su altri server. Ho verificato se il servizio Informazioni applicazione è in esecuzione e funziona correttamente. Non ci sono registri di sistema nel Visualizzatore eventi.

Tuttavia, ho questo errore di applicazione che viene generato quando viene chiamato Start-WebAppPool:

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

Qualcuno sa perché questo potrebbe accadere? Ho provato a scrivere un ciclo do-while fino a quando non si trova in uno stato "Avviato", ma i cicli falliscono per sempre.

Aggiornare

Risulta che il processo non si interrompe quando spengo il pool di applicazioni.

Perché il processo dovrebbe continuare a essere eseguito dopo l'arresto del pool di applicazioni? Continua letteralmente a correre, senza fermarsi.

Fisso!

Quindi - seguendo i commenti qui sotto, quando interrompo il pool di applicazioni ora mi assicuro che sia completamente allo stato di arresto prima di continuare lo script.

Questo è lo script che ho ora e funziona perfettamente:

# 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" )

1
Mi sembra che tu stia eseguendo correttamente il comando di arresto del pool di app, ma in realtà non si interrompe quando tenti di avviarlo di nuovo. Probabilmente perché il "processo" che menzioni nella tua modifica lo tiene in uno stato di esecuzione (o forse in uno stato di "arresto"), in attesa che qualcosa finisca. È sempre lo stesso processo che lo tiene? Che cos'è questo processo? (Processo di sistema o parte della tua app Web o ???). Se è un processo che a parte la tua app Web, perché non eseguire il debug e capire cosa sta aspettando (se non altro)?
Ƭᴇcʜιᴇ007,

1
Come stop-gap, forse aggiungi il codice al tuo script per attendere che il pool di app sia effettivamente in uno stato di arresto prima di continuare nello script?
Ƭᴇcʜιᴇ007,

2
@ Base33, puoi incollare la risposta in una risposta e contrassegnare è la soluzione? Quindi questo non verrà più visualizzato come "senza risposta"
HackSlash,

Risposte:


1

Octopus Deploy ha alcuni script PowerShell della community, che puoi trovare qui https://library.octopus.com/listing

Questo è il contenuto di uno di essi, che ha dei tentativi:

# 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"
}

Che proviene da questo modello di libreria https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.