पॉवर्सशेल स्क्रिप्ट के माध्यम से ऐप पूल शुरू करने की कोशिश कर रहा है - रुक-रुक कर त्रुटि हो रही है


19

मेरे पास एक बैच स्क्रिप्ट है जो मुझे एक साइट को बंद करने, फाइलों को तैनात करने और साइट को वापस चालू करने की अनुमति देती है।

  1. एप्लिकेशन पूल बंद करो - काम करता है
  2. वेबसाइट बंद करो - काम करता है
  3. फ़ाइलें तैनात करें - काम करता है
  4. एप्लिकेशन पूल शुरू करें - कभी-कभी ही काम करता है!
  5. वेबसाइट शुरू करें - अगर पिछले काम करता है

मैं Windows Server 2012 R2 चला रहा हूं, और ऑक्टोपस डिप्लॉय टेंकल द्वारा बैच स्क्रिप्ट निष्पादित की जाती है।

यह जिस लाइन पर फेल हो रहा है वह है:

 Start-WebAppPool -Name $appPoolName

जहां $ appPoolName live.website.com है

यह रेखा कभी-कभी काम करती है लेकिन अन्य नहीं, और किसी भी पैटर्न में सुसंगत नहीं है।

मेरे पास अन्य सर्वर पर समान स्क्रिप्ट काम कर रही है। मैंने जाँच की है कि अनुप्रयोग सूचना सेवा चल रही है या नहीं और यह ठीक चल रही है। इवेंट व्यूअर में कोई सिस्टम लॉग नहीं हैं।

हालाँकि, मेरे पास यह एक आवेदन त्रुटि है जो स्टार्ट-वेबएपपूल कहे जाने पर उठाई जाती है:

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

क्या किसी को पता है कि ऐसा क्यों हो सकता है? मैंने एक "शुरू" अवस्था में होने तक एक लूप करते हुए लिखने की कोशिश की है, लेकिन यह हमेशा के लिए विफल हो जाता है।

अपडेट करें

जब मैं एप्लिकेशन पूल बंद करता हूं तो प्रक्रिया बंद नहीं होती है।

एप्लिकेशन पूल को रोकने के बाद प्रक्रिया क्यों चलती रहेगी? यह सचमुच बिना रुके चलता रहता है।

फिक्स्ड!

इसलिए - नीचे दी गई टिप्पणियों के बाद, जब मैं एप्लिकेशन पूल को रोक देता हूं तो मैं यह सुनिश्चित करता हूं कि यह स्क्रिप्ट जारी रखने से पहले पूरी तरह से बंद अवस्था में हो।

यह स्क्रिप्ट है जो अब मेरे पास है और पूरी तरह से काम कर रही है:

# 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
मुझे लगता है जैसे आप ऐप पूल स्टॉप कमांड को सफलतापूर्वक जारी कर रहे हैं, लेकिन जब तक आप इसे फिर से शुरू करने की कोशिश नहीं करते, तब तक यह वास्तव में बंद नहीं होता है। शायद इसलिए कि आपके संपादन में जिस "प्रक्रिया" का आप उल्लेख कर रहे हैं, वह चल रही स्थिति में है (या शायद "रोक" स्थिति में), किसी चीज़ के समाप्त होने का इंतज़ार कर रही है। क्या हमेशा इसे पकड़े रहना एक ही प्रक्रिया है? वह प्रक्रिया क्या है? (सिस्टम प्रक्रिया, या आपके वेब ऐप का हिस्सा, या ???)। यदि यह एक प्रक्रिया है जो आपके वेब ऐप के अलावा है, तो इसे डिबग क्यों नहीं करना चाहिए और यह पता लगाना चाहिए कि यह (यदि कुछ भी) पर इंतजार कर रहा है?
15c atιᴇ007

1
स्टॉप-गैप के रूप में, संभवत: स्क्रिप्ट में जारी रखने से पहले ऐप पूल वास्तव में रुकने तक अपनी स्क्रिप्ट में कोड जोड़ें?
Ƭᴇc atιᴇ007

2
@ Base33, क्या आप उत्तर को उत्तर में चिपका सकते हैं और समाधान के रूप में निशान है? फिर यह "अनुत्तरित" के रूप में दिखाई नहीं देगा
हैकस्लैश

जवाबों:


1

ऑक्टोपस डिप्लॉय के पास कुछ कम्युनिटी पॉवरशेल स्क्रिप्ट हैं, जिन्हें आप 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 से आता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.