2012-08-04 16 views
7

मेरे पास बैच फ़ाइलों में कई स्टार्टअप कार्य हैं। विशेष रूप से मैं आईआईएस को कॉन्फ़िगर करने के लिए आईआईएस के appcmd.exe पर कॉल करता हूं। Azure में स्टार्टअप कार्यों को किसी कारण से भूमिका को पुनरारंभ करने के मामले में बेवकूफ माना जाता है (यानी, एक ही परिणाम के साथ बार-बार चलाने में सक्षम)। दुर्भाग्य से मेरे कई आईआईएस कॉन्फ़िगरेशन कमांड दूसरी बार असफल हो जाएंगे, उदाहरण के लिए, क्योंकि वे पहली बार कॉन्फ़िगरेशन नोड को हटाते हैं जो बाद के रनों पर मौजूद नहीं होता है।स्टार्टअप कार्यों को बेवकूफ़ बनाने के लिए कैसे करें?

मेरा सवाल है, मैं इन स्टार्टअप कार्यों को बेवकूफ कैसे बना सकता हूं? क्या appcmd.exe त्रुटियों को फेंकने का कोई तरीका नहीं है? क्या खोल को त्रुटियों को पकड़ने का कोई तरीका है? क्या Azure ढांचे को त्रुटियों को अनदेखा करने का कोई तरीका है?

यहां मेरे स्टार्टअप कार्यों का एक उदाहरण दिया गया है। यह सब एक कमांड फ़ाइल, configiis.cmd में निहित है।

@REM Enable IIS compression for application/json MIME type 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']" /commit:apphost 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost 

@REM Set IIS to automatically start AppPools 
%windir%\system32\inetsrv\appcmd.exe set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning /commit:apphost 

@REM Set IIS to not shut down idle AppPools 
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 /commit:apphost 

@REM But don't automatically start the AppPools that we don't use, and do shut them down when idle 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='Classic .NET AppPool'].startMode:OnDemand" "/[name='Classic .NET AppPool'].autoStart:False" "/[name='Classic .NET AppPool'].processModel.idleTimeout:00:01:00" /commit:apphost 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0'].startMode:OnDemand" "/[name='ASP.NET v4.0'].autoStart:False" "/[name='ASP.NET v4.0'].processModel.idleTimeout:00:01:00" /commit:apphost 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0 Classic'].startMode:OnDemand" "/[name='ASP.NET v4.0 Classic'].autoStart:False" "/[name='ASP.NET v4.0 Classic'].processModel.idleTimeout:00:01:00" /commit:apphost 


@REM remove IIS response headers 
%windir%\system32\inetsrv\appcmd.exe set config /section:httpProtocol /-customHeaders.[name='X-Powered-By'] 
+0

बहुत यकीन है कि अप्रयुक्त ऐपपूल को स्वचालित रूप से शुरू करने से रोकने वाली लाइनें काम नहीं करेंगी। 'क्लासिक .NET AppPool' इत्यादि का उपयोग करने के बजाय आपको Clr2ClassicAppPool आदि का उपयोग करने की आवश्यकता है। –

+0

वास्तव में वे नाम ठीक काम करते हैं, लेकिन इसे थोड़ा अलग उद्धृत करने की आवश्यकता थी। मैंने ऊपर दिए गए कोड को अपडेट किया है, बस अगर कोई इसे बाद में देखता है। –

उत्तर

4

@ सिंटेक्स 4 के उत्तर के अलावा: स्थानीय रूप से एक ब्रेडक्रंब (फ़ाइल) के उपयोग पर विचार करें। अपनी स्क्रिप्ट में, किसी ज्ञात फ़ाइल के अस्तित्व की जांच करें (जिसे आप बनाते हैं)। यदि यह अस्तित्व में नहीं है, तो अपनी स्टार्टअप स्क्रिप्ट के माध्यम से जाएं, एक ब्रेडक्रंब फ़ाइल भी बनाएं। अगली बार जब वीएम शुरू होता है, तो यह फिर से ब्रेडक्रंब फ़ाइल के अस्तित्व की जांच करेगा और यदि यह मौजूद है, तो cmd फ़ाइल से बाहर निकलें। यदि ब्रेडक्रंब फ़ाइल गायब हो जाती है, तो इसका मतलब है कि आपका वीएम कहीं और पुनर्निर्मित किया गया है (या तो एक नया उदाहरण या एक अलग उदाहरण पर एक श्वसन उदाहरण) और आईआईएस कॉन्फ़िगरेशन की आवश्यकता होगी।

+0

एक अच्छा विचार की तरह लगता है। किसी भी विचार को .cmd स्क्रिप्ट में इसे कैसे कार्यान्वित किया जाए? मुझे यकीन है कि मैं इसे अंततः समझ सकता हूं, लेकिन ऐसा लगता है जैसे आपने पहले ऐसा कुछ किया होगा। –

+0

यदि कोई भविष्य में इसे पढ़ता है, तो मैंने इसे किसी अन्य उत्तर में लागू करने के लिए कोड जोड़ा। –

3

यदि config सेटिंग इसे हटाने के लिए प्रयास करने से पहले मौजूद है देखने के लिए जाँच करने के लिए होगा (सशर्त तर्क जोड़ें)। यह द्वारा प्राप्त किया जा सकता है:

'appcmd.exe सूची config -details'

एक वापसी मान कैप्चरिंग आप, के खिलाफ तुलना में यह उत्पादन की लंबाई या एक वास्तविक मूल्य होने के लिए कुछ देना होगा।

2

डेविड मकोगॉन के सुझाव के आधार पर, मैंने अपनी प्रत्येक .cmd फ़ाइलों के शीर्ष पर निम्न को जोड़ा। ऐसा लगता है कि यह चाल है। यह निष्पादन स्क्रिप्ट के समान निर्देशिका में एक ध्वज फ़ाइल (जिसे डेविड को ब्रेडक्रंब फ़ाइल कहा जाता है) बना देगा, फिर उसके बाद के रनों पर इसकी जांच करें।

@REM A file to flag that this script has already run 
@REM because if we run it twice, it errors out and prevents the Azure role from starting properly 
@REM %~n0 expands to the name of the currently executing file, without the extension 
SET FLAGFILE=c:\%~n0-flag.txt 

IF EXIST "%FLAGFILE%" (
    ECHO %FLAGFILE% exists, exiting startup script 
    exit /B 
) ELSE (
    date /t > %FLAGFILE% 
) 
+0

आपको फ्लैग फ़ाइल नाम में '% ComputerName% 'भी रखना चाहिए! उपयोगी हो जाएगा! – wasatchwizard

+0

यह उपयोगी क्यों होगा? –

3

एमएसडीएन में अब एपीसीसीएमडी से त्रुटि कोडों को संभालने के लिए ऐसा करने के लिए एक उत्कृष्ट मार्गदर्शिका है।

http://msdn.microsoft.com/en-us/library/windowsazure/hh974418.aspx

मूल रूप से किसी भी appcmd ऑपरेशन के बाद, आप निम्न कर सकते हैं:

IF %ERRORLEVEL% EQU 183 DO VERIFY > NUL 

और किसी भी स्वीकार्य त्रुटि कोड ध्यान न दें।

+0

बहुत अच्छा। ऐसा लगता है कि ऐसा करने का "सही" तरीका हो सकता है। बहुत बुरा त्रुटि प्रबंधन बहुत verbose है। –

+1

यह एमएसडीएन आलेख में एक त्रुटि प्रतीत होता है - 'डीओ' अत्यधिक है क्योंकि वाक्यविन्यास 'IF' कमांड है: 'IF [/ I] string1 तुलना-op string2 कमांड'। और DO कीवर्ड केवल 'FOR' कमांड पर लागू होता है। तो सही कमांड इस तरह दिखना चाहिए: 'IF% ERRORLEVEL% EQU 183 सत्यापित> NUL'। यह मेरे लिए काम करता था, जबकि मूल ने स्क्रिप्ट को सभी को शुरू करने से रोकने से रोक दिया। – Vertigo

0

मैं आपके list कमांड के अंत में /config:* /xml का उपयोग करने की अत्यधिक अनुशंसा करता हूं। IIS idempotent को कैसे बनाया गया है, इस बारे में अधिक जानकारी के लिए कृपया देखें: https://github.com/opscode-cookbooks/iis

शेफ एकाधिक कॉन्फ़िगरेशन प्रबंधन प्लेटफ़ॉर्म में से एक है और मैं केवल कोड (रूबी में) के लिए इसे देखने का सुझाव दे रहा हूं जो वर्तमान सेटिंग्स को सूचीबद्ध करके बेवकूफ बनाता है और उन्हें बदलने के लिए अनुरोध की जा रही सेटिंग्स से तुलना।

संबंधित मुद्दे