Cố gắng khởi động nhóm ứng dụng thông qua Powershell Script - gặp lỗi không liên tục


19

Tôi có một tập lệnh bó cho phép tôi tắt một trang web, triển khai các tệp và bật lại trang web.

  1. Dừng nhóm ứng dụng - hoạt động
  2. Dừng trang web - hoạt động
  3. Triển khai tệp - công trình
  4. Bắt đầu ứng dụng Pool - đôi khi chỉ hoạt động!
  5. Bắt đầu trang web - hoạt động nếu công việc trước đó

Tôi đang chạy Windows Server 2012 R2 và tập lệnh bó được thực thi bởi một xúc tu Octopus Deploy.

Dòng nó không thành công là:

 Start-WebAppPool -Name $appPoolName

$ AppPoolName là live.website.com

Dòng này đôi khi hoạt động nhưng không phải là dòng khác, và không nhất quán trong bất kỳ mẫu nào.

Tôi có cùng một kịch bản làm việc trên các máy chủ khác. Tôi đã kiểm tra xem dịch vụ Thông tin ứng dụng có chạy hay không và nó có chạy tốt không. Không có nhật ký hệ thống trong trình xem sự kiện.

Mặc dù, tôi có một lỗi ứng dụng này được nêu ra khi Start-WebAppPool được gọi:

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

Có ai biết tại sao điều này có thể xảy ra? Tôi đã cố gắng viết một vòng lặp do-while cho đến khi nó ở trạng thái "Bắt đầu", nhưng nó lặp lại thất bại mãi mãi.

Cập nhật

Hóa ra quá trình không dừng lại khi tôi tắt nhóm Ứng dụng.

Tại sao quá trình sẽ tiếp tục chạy sau khi dừng nhóm ứng dụng? Nó thực sự tiếp tục chạy, không dừng lại.

Đã sửa!

Vì vậy - theo các bình luận bên dưới, khi tôi dừng nhóm ứng dụng, bây giờ tôi chắc chắn rằng nó hoàn toàn ở trạng thái dừng trước khi tiếp tục tập lệnh.

Đây là kịch bản bây giờ tôi có và đang hoạt động đầy đủ:

# 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
Âm thanh với tôi giống như bạn đang ban hành lệnh dừng App Pool thành công, nhưng nó không thực sự dừng lại khi bạn cố gắng khởi động lại. Có lẽ bởi vì "quy trình" mà bạn đề cập trong bản chỉnh sửa của bạn đang giữ nó ở trạng thái đang chạy (hoặc có thể ở trạng thái "dừng"), chờ đợi một cái gì đó kết thúc. Có phải nó luôn luôn là quá trình giữ nó? Quá trình đó là gì? (Quá trình hệ thống hoặc một phần của ứng dụng web của bạn hoặc ???). Nếu đó là một quá trình ngoài ứng dụng web của bạn, thì tại sao không gỡ lỗi nó và tìm hiểu xem nó đang chờ đợi điều gì (nếu có gì)?
Ƭᴇcʜιᴇ007

1
Là một khoảng trống, có lẽ thêm mã vào tập lệnh của bạn để đợi cho đến khi nhóm ứng dụng thực sự ở trạng thái dừng trước khi tiếp tục trong tập lệnh?
Ƭᴇcʜιᴇ007

2
@ Base33, bạn có thể dán câu trả lời trong câu trả lời và đánh dấu là giải pháp không? Sau đó, điều này sẽ không còn hiển thị là "chưa được trả lời"
HackSlash

Câu trả lời:


1

Octopus Deploy có một số tập lệnh PowerShell cộng đồng, bạn có thể tìm thấy ở đây https: // l Library.octopus.com/listing

Đây là nội dung của một trong số họ, đã thử lại:

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

Xuất phát từ mẫu thư viện này https: // l Library.octopus.com/step-temsheet/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.