พยายามเริ่มพูลแอพผ่าน Powershell Script - รับข้อผิดพลาดเป็นระยะ ๆ


19

ฉันมีสคริปต์แบตช์ที่อนุญาตให้ฉันปิดไซต์ปรับใช้ไฟล์และเปิดไซต์อีกครั้ง

  1. หยุดแอพพลิเคชั่นพูล - ทำงาน
  2. หยุดเว็บไซต์ - ใช้งานได้
  3. ปรับใช้ไฟล์ - ใช้งานได้
  4. เริ่มกลุ่มแอปพลิเคชัน - บางครั้งใช้งานได้เท่านั้น!
  5. เริ่มเว็บไซต์ - ใช้งานได้หากใช้งานก่อนหน้านี้

ฉันใช้ Windows Server 2012 R2 และสคริปต์แบทช์ดำเนินการโดยหนวดปลาหมึก Octopus Deploy

บรรทัดที่มันล้มเหลวคือ:

 Start-WebAppPool -Name $appPoolName

ที่ $ appPoolName คือ live.website.com

บางครั้งบรรทัดนี้ใช้งานได้ แต่ไม่ใช่สายอื่นและไม่สอดคล้องกันในรูปแบบใด ๆ

ฉันมีสคริปต์เดียวกันทำงานบนเซิร์ฟเวอร์อื่น ๆ ฉันตรวจสอบว่าบริการข้อมูลแอปพลิเคชันทำงานอยู่หรือไม่และทำงานได้ดี ไม่มีบันทึกของระบบในตัวแสดงเหตุการณ์

แม้ว่าฉันจะมีข้อผิดพลาดของแอปพลิเคชั่นตัวนี้ซึ่งเกิดขึ้นเมื่อมีการเรียก Start-WebAppPool:

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

มีใครรู้บ้างไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันพยายามเขียนลูป do-while จนกระทั่งอยู่ในสถานะ "เริ่มต้น" แต่ลูปล้มเหลวตลอดไป

ปรับปรุง

เปิดใช้งานกระบวนการไม่หยุดทำงานเมื่อฉันปิด Application pool

เหตุใดกระบวนการจึงทำงานต่อหลังจากหยุดแอปพลิเคชัน แท้จริงมันยังคงทำงานโดยไม่หยุด

แก้ไขแล้ว!

ดังนั้น - ตามความคิดเห็นด้านล่างเมื่อฉันหยุดกลุ่มแอพพลิเคชั่นตอนนี้ฉันตรวจสอบให้แน่ใจว่ามันอยู่ในสถานะหยุดอย่างสมบูรณ์ก่อนที่จะดำเนินการต่อสคริปต์

นี่คือสคริปต์ที่ฉันมีตอนนี้และทำงานได้อย่างสมบูรณ์:

# 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
ฟังดูเหมือนว่าคุณกำลังออกคำสั่งหยุด App App สำเร็จ แต่จริง ๆ แล้วมันไม่ได้หยุดในเวลาที่คุณพยายามเริ่มใหม่อีกครั้ง อาจเป็นเพราะ "กระบวนการ" ที่คุณพูดถึงในการแก้ไขของคุณกำลังถืออยู่ในสถานะกำลังทำงาน (หรืออาจอยู่ในสถานะ "หยุด") รอให้บางสิ่งบางอย่างเสร็จสิ้น มันเป็นกระบวนการเดียวกันเสมอหรือไม่? กระบวนการนั้นคืออะไร? (กระบวนการของระบบหรือส่วนหนึ่งของเว็บแอปของคุณหรือ ???) หากเป็นกระบวนการที่นอกเหนือจากแอปพลิเคชันเว็บของคุณทำไมไม่ลองดีบั๊กและหาว่ากำลังรออะไรอยู่ (ถ้ามี)
Ƭᴇcʜιᴇ007

1
ในฐานะช่องว่างหยุดอาจเพิ่มรหัสลงในสคริปต์ของคุณเพื่อรอจนกว่ากลุ่มแอปจะอยู่ในสถานะหยุดทำงานก่อนที่จะดำเนินการต่อในสคริปต์
Ƭᴇcʜιᴇ007

2
@ Base33 คุณสามารถวางคำตอบในคำตอบและทำเครื่องหมายว่าเป็นวิธีแก้ปัญหาหรือไม่ จากนั้นสิ่งนี้จะไม่ปรากฏเป็น "ไม่ได้รับคำตอบ" อีกต่อไป
HackSlash

คำตอบ:


1

การปรับใช้ Octopus มีสคริปต์ PowerShell บางชุมชนซึ่งคุณสามารถดูได้ที่นี่https://library.octopus.com/listing

นี่คือเนื้อหาของหนึ่งในนั้นที่ได้ลองใหม่อีกครั้ง:

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

ซึ่งมาจากเทมเพลตไลบรารีนี้https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.