Próba uruchomienia puli aplikacji za pomocą skryptu Powershell - sporadycznie pojawia się błąd

19

Mam skrypt wsadowy, który pozwala mi wyłączyć witrynę, wdrożyć pliki i ponownie ją włączyć.

  1. Zatrzymaj pulę aplikacji - działa
  2. Zatrzymaj stronę - działa
  3. Wdróż pliki - działa
  4. Uruchom pulę aplikacji - działa tylko czasami!
  5. Uruchom stronę - działa, jeśli poprzednie działały

Korzystam z systemu Windows Server 2012 R2, a skrypt wsadowy jest wykonywany przez mackę Octopus Deploy.

Linia, na której nie działa, to:

 Start-WebAppPool -Name $appPoolName

Gdzie $ appPoolName to live.website.com

Ta linia działa czasami, ale nie w innych, i nie jest spójna w żadnym wzorze.

Mam ten sam skrypt działający na innych serwerach. Sprawdziłem, czy usługa informacji o aplikacji jest uruchomiona i działa poprawnie. W przeglądarce zdarzeń nie ma dzienników systemowych.

Chociaż mam ten jeden błąd aplikacji, który pojawia się, gdy wywoływana jest funkcja Start-WebAppPool:

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

Czy ktoś wie, dlaczego tak się dzieje? Próbowałem napisać pętlę „do-while”, dopóki nie znajdzie się ona w stanie „Uruchomiona”, ale pętle na zawsze zawodzą.

Aktualizacja

Okazuje się, że proces nie zatrzymuje się po wyłączeniu puli aplikacji.

Dlaczego proces miałby być kontynuowany po zatrzymaniu puli aplikacji? Dosłownie kontynuuje pracę, bez zatrzymywania się.

Naprawiony!

Tak więc - postępując zgodnie z poniższymi komentarzami, kiedy zatrzymuję pulę aplikacji, upewniam się, że jest ona całkowicie zatrzymana przed kontynuowaniem skryptu.

Oto skrypt, który mam teraz i działa:

# 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" )
Baza33
źródło
1
Wydaje mi się, że z powodzeniem wydajesz polecenie zatrzymania puli aplikacji, ale tak naprawdę nie jest zatrzymywane do momentu, gdy spróbujesz go uruchomić ponownie. Prawdopodobnie dlatego, że „proces”, o którym wspominasz w swojej edycji, utrzymuje go w stanie uruchomionym (lub być może w stanie „zatrzymania”), czekając, aż coś się zakończy. Czy trzymanie go zawsze jest tym samym procesem? Co to za proces? (Proces systemowy lub część aplikacji internetowej lub ???). Jeśli jest to proces, który oprócz twojej aplikacji internetowej, to dlaczego nie debugować go i dowiedzieć się, na co czeka (jeśli cokolwiek)?
ᴇcʜιᴇ007
1
Jako przerwę, być może dodaj kod do skryptu, aby poczekać, aż pula aplikacji będzie w stanie zatrzymania, zanim przejdziesz dalej do skryptu?
ᴇcʜιᴇ007
2
@ Base33, czy możesz wkleić odpowiedź w odpowiedzi i oznaczyć jako rozwiązanie? To nie będzie już wyświetlane jako „bez odpowiedzi”
HackSlash

Odpowiedzi:

1

Octopus Deploy ma kilka społecznościowych skryptów PowerShell, które można znaleźć tutaj https://library.octopus.com/listing

To jest zawartość jednego z nich, który ma ponownych prób:

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

Który pochodzi z tego szablonu biblioteki https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

spikey_richie
źródło