Powershell Script ile uygulama havuzunu başlatmaya çalışıyorum - aralıklı olarak hata alıyorum


19

Bir siteyi kapatmak, dosyaları dağıtmak ve siteyi yeniden açmak için izin veren bir toplu iş komut dosyası var.

  1. Uygulama havuzunu durdurma - çalışıyor
  2. Web sitesini durdurun - çalışıyor
  3. Dosyaları dağıtma - çalışır
  4. Uygulama Havuzunu Başlat - yalnızca bazen çalışır!
  5. Web sitesini başlat - daha önce çalışırsa çalışır

Windows Server 2012 R2 çalıştırıyorum ve toplu komut dosyası bir Octopus Deploy tentacle tarafından yürütülür.

Başarısız olduğu hat:

 Start-WebAppPool -Name $appPoolName

$ AppPoolName nerede live.website.com

Bu çizgi bazen çalışır, ancak diğerleri değil ve herhangi bir düzende tutarlı değildir.

Diğer sunucularda çalışan aynı komut dosyası var. Uygulama Bilgileri hizmetinin çalışıp çalışmadığını ve iyi çalışıp çalışmadığını kontrol ettim. Olay görüntüleyicide hiçbir sistem günlüğü yok.

Her ne kadar, Start-WebAppPool çağrıldığında yükseltilen bu bir uygulama hatası var:

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

Bunun neden olabileceğini bilen var mı? Ben bir "Başladı" durumuna kadar bir do-while döngü yazmaya çalıştım, ama sonsuza kadar başarısız döngüler.

Güncelleme

Uygulama havuzunu kapattığımda işlemin durmadığı anlaşılıyor.

Uygulama havuzunu durdurduktan sonra işlem neden devam ediyor? Kelimenin tam anlamıyla durmadan çalışmaya devam ediyor.

Sabit!

Bu yüzden - aşağıdaki yorumları izleyerek, uygulama havuzunu durdurduğumda, komut dosyasına devam etmeden önce tamamen durmuş durumda olduğundan emin olun.

Bu şimdi var ve tamamen çalışıyor komut dosyası:

# 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
Uygulama Havuzu durdurma komutunu başarıyla yayınlıyormuşsunuz gibi geliyor, ancak yeniden başlatmayı denediğinizde aslında durmuyor. Muhtemelen düzenlemenizde bahsettiğiniz "işlem", onu çalışan bir durumda tutuyor (veya belki de "durdurma" durumunda), bir şeyin bitmesini bekliyor. Onu tutmak her zaman aynı süreç midir? Bu süreç nedir? (Sistem işlemi veya web uygulamanızın bir parçası veya ???). Web uygulamanızdan ayrı bir süreçse, neden hata ayıklama ve ne beklediğini (bir şey varsa) anlamıyorsunuz?
Novcʜιᴇ007

1
Bir durma boşluğu olarak, komut dosyasına devam etmeden önce uygulama havuzunun gerçekten durmuş durumda olmasını beklemek için kodunuza belki kod ekleyin?
Novcʜιᴇ007

2
@ Base33, cevabı bir cevaba yapıştırabilir ve çözüm olarak işaretleyebilir misiniz? O zaman bu artık "cevapsız" olarak gösterilmez
HackSlash

Yanıtlar:


1

Octopus Deploy'un burada bulabileceğiniz bazı topluluk PowerShell komut dosyaları vardır https://library.octopus.com/listing

Bu, denemeleri olan birinin içeriğidir:

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

Bu kütüphane şablonundan gelenler https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.