Mencoba memulai kumpulan aplikasi melalui Powershell Script - mendapatkan error sesekali

19

Saya memiliki skrip batch yang memungkinkan saya mematikan situs, menyebarkan file, dan menghidupkan kembali situs.

  1. Hentikan kumpulan aplikasi - berfungsi
  2. Hentikan situs web - berfungsi
  3. Menyebarkan file - berfungsi
  4. Mulai Application Pool - hanya berfungsi kadang-kadang!
  5. Mulai situs web - berfungsi jika karya sebelumnya

Saya menjalankan Windows Server 2012 R2, dan skrip batch dijalankan oleh tentakel Octopus Deploy.

Baris yang gagal adalah:

 Start-WebAppPool -Name $appPoolName

Di mana $ appPoolName adalah live.website.com

Baris ini kadang-kadang berfungsi tetapi tidak pada yang lain, dan tidak konsisten dalam pola apa pun.

Saya memiliki skrip yang sama bekerja di server lain. Saya telah memeriksa apakah layanan Informasi Aplikasi berjalan dan berjalan dengan baik. Tidak ada log sistem di penampil acara.

Meskipun, saya punya satu kesalahan aplikasi ini yang dinaikkan ketika Start-WebAppPool dipanggil:

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

Adakah yang tahu mengapa ini bisa terjadi? Saya telah mencoba untuk menulis loop do-while sampai berada dalam keadaan "Mulai", tetapi loop gagal selamanya.

Memperbarui

Ternyata prosesnya tidak berhenti ketika saya mematikan kumpulan Aplikasi.

Mengapa proses akan terus berjalan setelah menghentikan kumpulan aplikasi? Secara harfiah terus berjalan, tanpa henti.

Tetap!

Jadi - mengikuti komentar di bawah ini, ketika saya menghentikan kumpulan aplikasi saya sekarang memastikan itu benar-benar berhenti sebelum melanjutkan skrip.

Ini skrip yang sekarang saya miliki dan berfungsi sepenuhnya:

# 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
sumber
1
Kedengarannya bagi saya seperti Anda berhasil mengeluarkan perintah berhenti App Pool, tetapi sebenarnya tidak terhenti saat Anda mencoba memulainya lagi. Mungkin karena "proses" yang Anda sebutkan dalam suntingan Anda menahannya dalam keadaan berjalan (atau mungkin dalam keadaan "berhenti"), menunggu sesuatu selesai. Apakah selalu sama dengan proses memegangnya? Proses apa itu? (Proses sistem, atau bagian dari aplikasi web Anda, atau ???). Jika itu adalah proses yang terpisah dari aplikasi web Anda, lalu mengapa tidak men-debug itu dan mencari tahu apa yang menunggu (jika ada)?
Ƭᴇcʜιᴇ007
1
Sebagai gap-gap, mungkin menambahkan kode ke skrip Anda untuk menunggu sampai kumpulan aplikasi benar-benar dalam keadaan berhenti sebelum melanjutkan dalam skrip?
Ƭᴇcʜιᴇ007
2
@ Base33, dapatkah Anda menempelkan jawaban dalam jawaban dan tanda sebagai solusinya? Maka ini tidak akan lagi muncul sebagai "tidak dijawab"
HackSlash

Jawaban:

1

Octopus Deploy memiliki beberapa skrip PowerShell komunitas, yang dapat Anda temukan di sini https://library.octopus.com/listing

Ini adalah konten dari salah satunya, yang telah mencoba lagi:

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

Yang berasal dari templat perpustakaan ini https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

spikey_richie
sumber