Mam skrypt wsadowy, który pozwala mi wyłączyć witrynę, wdrożyć pliki i ponownie ją włączyć.
- Zatrzymaj pulę aplikacji - działa
- Zatrzymaj stronę - działa
- Wdróż pliki - działa
- Uruchom pulę aplikacji - działa tylko czasami!
- 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" )