Common Cloud Service (klasik) başlangıç görevleri

Önemli

Cloud Services (klasik) artık yeni müşteriler için kullanımdan kaldırılmıştır ve tüm müşteriler için 31 Ağustos 2024'te kullanımdan kaldırılacaktır. Yeni dağıtımlarda yeni Azure Resource Manager tabanlı dağıtım modeli Azure Cloud Services (genişletilmiş destek) kullanılmalıdır.

Bu makalede, bulut hizmetinizde gerçekleştirmek isteyebileceğiniz yaygın başlangıç görevlerine bazı örnekler verilmektedir. Bir rol başlamadan önce işlemleri gerçekleştirmek için başlangıç görevlerini kullanabilirsiniz. Gerçekleştirmek isteyebileceğiniz işlemler arasında bileşen yükleme, COM bileşenlerini kaydetme, kayıt defteri anahtarlarını ayarlama veya uzun süre çalışan bir işlem başlatma sayılabilir.

Başlangıç görevlerinin nasıl çalıştığını ve özellikle başlangıç görevini tanımlayan girişlerin nasıl oluşturulacağını anlamak için bu makaleye bakın.

Not

Başlangıç görevleri Sanal Makineler için geçerli değildir, yalnızca Bulut Hizmeti Web ve Çalışan rolleri için geçerlidir.

Rol başlamadan önce ortam değişkenlerini tanımlama

Belirli bir görev için tanımlanan ortam değişkenlerine ihtiyacınız varsa, Task öğesinin içindeki Environment öğesini kullanın.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WorkerRole name="WorkerRole1">
        ...
        <Startup>
            <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
                <Environment>
                    <Variable name="MyEnvironmentVariable" value="MyVariableValue" />
                </Environment>
            </Task>
        </Startup>
    </WorkerRole>
</ServiceDefinition>

Değişkenler, dağıtımla ilgili bir şeye başvurmak için geçerli bir Azure XPath değeri de kullanabilir. özniteliğini value kullanmak yerine bir RoleInstanceValue alt öğesi tanımlayın.

<Variable name="PathToStartupStorage">
    <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='StartupLocalStorage']/@path" />
</Variable>

iis başlatmayı AppCmd.exe ile yapılandırma

AppCmd.exe komut satırı aracı, Azure'da başlangıçta IIS ayarlarını yönetmek için kullanılabilir. AppCmd.exe , Azure'daki başlangıç görevlerinde kullanmak üzere yapılandırma ayarlarına kolay, komut satırı erişimi sağlar. AppCmd.exekullanılarak, uygulamalar ve siteler için web sitesi ayarları eklenebilir, değiştirilebilir veya kaldırılabilir.

Ancak, başlangıç görevi olarak AppCmd.exe kullanımında dikkate değer birkaç şey vardır:

  • Başlangıç görevleri yeniden başlatmalar arasında birden çok kez çalıştırılabilir. Örneğin, bir rol geri dönüşüme geçtiğinde.
  • birAppCmd.exe eylemi birden çok kez gerçekleştirilirse, bir hata oluşturabilir. Örneğin, Web.config iki kez bölüm eklemeye çalışmak hataya neden olabilir.
  • Başlangıç görevleri sıfır olmayan bir çıkış kodu veya hata düzeyi döndürüyorsa başarısız olur. Örneğin, AppCmd.exe bir hata oluşturduğunda.

AppCmd.exeçağrısından sonra errorlevel değerini denetlemek iyi bir uygulamadır; bu, aramayı bir .cmd dosyasıyla AppCmd.exe sarmalarsanız kolayca yapılır. Bilinen bir hata düzeyi yanıtı algılarsanız, bunu yoksayabilir veya geri geçirebilirsiniz.

AppCmd.exe tarafından döndürülen errorlevel, winerror.h dosyasında listelenir ve MSDN'de de görülebilir.

Hata düzeyini yönetme örneği

Bu örnek, Web.config dosyasına hata işleme ve günlüğe kaydetme ile bir sıkıştırma bölümü ve JSON için bir sıkıştırma girişi ekler.

ServiceDefinition.csdef dosyasının, executionContext özniteliğini Web.configdosyasındaki ayarları değiştirmek için elevated yeterliAppCmd.exe izin verecek şekilde ayarlamayı içeren ilgili bölümleri burada gösterilmiştir:

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WorkerRole name="WorkerRole1">
        ...
        <Startup>
            <Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple" />
        </Startup>
    </WorkerRole>
</ServiceDefinition>

Startup.cmd toplu iş dosyası ,Web.config dosyasına bir sıkıştırma bölümü ve JSON için sıkıştırma girişi eklemek için AppCmd.exe kullanır. Beklenen 183 hata düzeyi , VERIFY.EXE komut satırı programı kullanılarak sıfır olarak ayarlanır. Beklenmeyen hata düzeyleri StartupErrorLog.txt günlüğe kaydedilir.

REM   *** Add a compression section to the Web.config file. ***
%windir%\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1

REM   ERRORLEVEL 183 occurs when trying to add a section that already exists. This error is expected if this
REM   batch file were executed twice. This can occur and must be accounted for in an Azure startup
REM   task. To handle this situation, set the ERRORLEVEL to zero by using the Verify command. The Verify
REM   command will safely set the ERRORLEVEL to zero.
IF %ERRORLEVEL% EQU 183 VERIFY > NUL

REM   If the ERRORLEVEL is not zero at this point, some other error occurred.
IF %ERRORLEVEL% NEQ 0 (
    ECHO Error adding a compression section to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
    GOTO ErrorExit
)

REM   *** Add compression for json. ***
%windir%\system32\inetsrv\appcmd set config  -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1
IF %ERRORLEVEL% EQU 183 VERIFY > NUL
IF %ERRORLEVEL% NEQ 0 (
    ECHO Error adding the JSON compression type to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
    GOTO ErrorExit
)

REM   *** Exit batch file. ***
EXIT /b 0

REM   *** Log error and exit ***
:ErrorExit
REM   Report the date, time, and ERRORLEVEL of the error.
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
ECHO An error occurred during startup. ERRORLEVEL = %ERRORLEVEL% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT %ERRORLEVEL%

Güvenlik duvarı kuralları ekleme

Azure'da iki güvenlik duvarı vardır. İlk güvenlik duvarı, sanal makine ile dış dünya arasındaki bağlantıları denetler. Bu güvenlik duvarı, ServiceDefinition.csdef dosyasındaki EndPoints öğesi tarafından denetlenmektedir.

İkinci güvenlik duvarı, sanal makine ile bu sanal makine içindeki işlemler arasındaki bağlantıları denetler. Bu güvenlik duvarı komut satırı aracı tarafından netsh advfirewall firewall denetlenebilir.

Azure, rollerinizde başlatılan işlemler için güvenlik duvarı kuralları oluşturur. Örneğin, bir hizmet veya program başlattığınızda, Azure bu hizmetin İnternet ile iletişim kurmasına izin vermek için gerekli güvenlik duvarı kurallarını otomatik olarak oluşturur. Ancak, rolünüz dışındaki bir işlem (COM+ hizmeti veya Windows Zamanlanmış Görevi gibi) tarafından başlatılan bir hizmet oluşturursanız, söz konusu hizmete erişime izin vermek için el ile bir güvenlik duvarı kuralı oluşturmanız gerekir. Bu güvenlik duvarı kuralları bir başlangıç görevi kullanılarak oluşturulabilir.

Güvenlik duvarı kuralı oluşturan bir başlangıç görevinin yükseltilmiş executionContext değeri olmalıdır. Aşağıdaki başlangıç görevini ServiceDefinition.csdef dosyasına ekleyin.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WorkerRole name="WorkerRole1">
        ...
        <Startup>
            <Task commandLine="AddFirewallRules.cmd" executionContext="elevated" taskType="simple" />
        </Startup>
    </WorkerRole>
</ServiceDefinition>

Güvenlik duvarı kuralını eklemek için başlangıç toplu iş dosyanızda uygun netsh advfirewall firewall komutları kullanmanız gerekir. Bu örnekte, başlangıç görevi 80 numaralı TCP bağlantı noktası için güvenlik ve şifreleme gerektirir.

REM   Add a firewall rule in a startup task.

REM   Add an inbound rule requiring security and encryption for TCP port 80 traffic.
netsh advfirewall firewall add rule name="Require Encryption for Inbound TCP/80" protocol=TCP dir=in localport=80 security=authdynenc action=allow >> "%TEMP%\StartupLog.txt" 2>&1

REM   If an error occurred, return the errorlevel.
EXIT /B %errorlevel%

Belirli bir IP adresini engelleme

IIS web.config dosyanızı değiştirerek Azure web rolü erişimini belirtilen IP adresleri kümesine kısıtlayabilirsiniz. Ayrıca ,ApplicationHost.config dosyasının ipSecurity bölümünün kilidini açan bir komut dosyası kullanmanız gerekir.

ApplicationHost.config dosyasının ipSecurity bölümünün kilidini açmak için rol başlangıcında çalışan bir komut dosyası oluşturun. Web rolünüzün kök düzeyinde startup adlı bir klasör oluşturun ve bu klasörün içinde startup.cmd adlı bir toplu iş dosyası oluşturun. Bu dosyayı Visual Studio projenize ekleyin ve paketinize dahil olduğundan emin olmak için özellikleri Her Zaman Kopyala olarak ayarlayın.

Aşağıdaki başlangıç görevini ServiceDefinition.csdef dosyasına ekleyin.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WebRole name="WebRole1">
        ...
        <Startup>
            <Task commandLine="startup.cmd" executionContext="elevated" />
        </Startup>
    </WebRole>
</ServiceDefinition>

Bu komutu startup.cmd dosyasına ekleyin:

@echo off
@echo Installing "IPv4 Address and Domain Restrictions" feature 
powershell -ExecutionPolicy Unrestricted -command "Install-WindowsFeature Web-IP-Security"
@echo Unlocking configuration for "IPv4 Address and Domain Restrictions" feature 
%windir%\system32\inetsrv\AppCmd.exe unlock config -section:system.webServer/security/ipSecurity

Bu görev, web rolü her başlatıldığında startup.cmd toplu iş dosyasının çalıştırılmasına neden olur ve gerekli ipSecurity bölümünün kilidinin açılmasını sağlar.

Son olarak, aşağıdaki örnekte gösterildiği gibi, erişim verilen IP adreslerinin listesini eklemek için web rolünüzün web.config dosyasının system.webServer bölümünü değiştirin:

Bu örnek yapılandırma, tanımlanan ikisi dışında tüm IP'lerin sunucuya erişmesine izin verir

<system.webServer>
    <security>
    <!--Unlisted IP addresses are granted access-->
    <ipSecurity>
        <!--The following IP addresses are denied access-->
        <add allowed="false" ipAddress="192.168.100.1" subnetMask="255.255.0.0" />
        <add allowed="false" ipAddress="192.168.100.2" subnetMask="255.255.0.0" />
    </ipSecurity>
    </security>
</system.webServer>

Bu örnek yapılandırma, tanımlanan ikisi dışında tüm IP'lerin sunucuya erişmesini engeller .

<system.webServer>
    <security>
    <!--Unlisted IP addresses are denied access-->
    <ipSecurity allowUnlisted="false">
        <!--The following IP addresses are granted access-->
        <add allowed="true" ipAddress="192.168.100.1" subnetMask="255.255.0.0" />
        <add allowed="true" ipAddress="192.168.100.2" subnetMask="255.255.0.0" />
    </ipSecurity>
    </security>
</system.webServer>

PowerShell başlangıç görevi oluşturma

Windows PowerShell betikleri doğrudan ServiceDefinition.csdef dosyasından çağrılamaz, ancak başlangıç toplu iş dosyasının içinden çağrılabilir.

PowerShell (varsayılan olarak) imzalanmamış betikleri çalıştırmaz. Betiğinizi imzalamadığınız sürece PowerShell'i imzalanmamış betikleri çalıştıracak şekilde yapılandırmanız gerekir. İmzasız betikleri çalıştırmak için ExecutionPolicyKısıtlanmamış olarak ayarlanmalıdır. Kullandığınız ExecutionPolicy ayarı, Windows PowerShell sürümünü temel alır.

REM   Run an unsigned PowerShell script and log the output
PowerShell -ExecutionPolicy Unrestricted .\startup.ps1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   If an error occurred, return the errorlevel.
EXIT /B %errorlevel%

PowerShell 2.0 veya 1.0 çalıştıran bir Konuk işletim sistemi kullanıyorsanız, sürüm 2'yi çalıştırmaya zorlayabilirsiniz ve kullanılamıyorsa sürüm 1'i kullanabilirsiniz.

REM   Attempt to set the execution policy by using PowerShell version 2.0 syntax.
PowerShell -Version 2.0 -ExecutionPolicy Unrestricted .\startup.ps1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   If PowerShell version 2.0 isn't available. Set the execution policy by using the PowerShell
IF %ERRORLEVEL% EQU -393216 (
   PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
   PowerShell .\startup.ps1 >> "%TEMP%\StartupLog.txt" 2>&1
)

REM   If an error occurred, return the errorlevel.
EXIT /B %errorlevel%

Başlangıç görevinden yerel depolamada dosya oluşturma

Başlangıç göreviniz tarafından oluşturulan ve uygulamanız tarafından daha sonra erişilen dosyaları depolamak için yerel bir depolama kaynağı kullanabilirsiniz.

Yerel depolama kaynağını oluşturmak için ServiceDefinition.csdef dosyasına bir LocalResources bölümü ekleyin ve ardından LocalStorage alt öğesini ekleyin. Yerel depolama kaynağına benzersiz bir ad ve başlangıç göreviniz için uygun bir boyut verin.

Başlangıç görevinizde yerel bir depolama kaynağı kullanmak için, yerel depolama kaynağı konumuna başvurmak üzere bir ortam değişkeni oluşturmanız gerekir. Ardından başlangıç görevi ve uygulama dosyaları yerel depolama kaynağına okuyabilir ve yazabiliyor.

ServiceDefinition.csdef dosyasının ilgili bölümleri burada gösterilmiştir:

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1">
    ...

    <LocalResources>
      <LocalStorage name="StartupLocalStorage" sizeInMB="5"/>
    </LocalResources>

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>
          <Variable name="PathToStartupStorage">
            <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='StartupLocalStorage']/@path" />
          </Variable>
        </Environment>
      </Task>
    </Startup>
  </WorkerRole>
</ServiceDefinition>

Örneğin, bu Startup.cmd toplu iş dosyası, yerel depolama konumunda dosya MyTest.txt oluşturmak için PathToStartupStorage ortam değişkenini kullanır.

REM   Create a simple text file.

ECHO This text will go into the MyTest.txt file which will be in the    >  "%PathToStartupStorage%\MyTest.txt"
ECHO path pointed to by the PathToStartupStorage environment variable.  >> "%PathToStartupStorage%\MyTest.txt"
ECHO The contents of the PathToStartupStorage environment variable is   >> "%PathToStartupStorage%\MyTest.txt"
ECHO "%PathToStartupStorage%".                                          >> "%PathToStartupStorage%\MyTest.txt"

REM   Exit the batch file with ERRORLEVEL 0.

EXIT /b 0

GetLocalResource yöntemini kullanarak Azure SDK'dan yerel depolama klasörüne erişebilirsiniz.

string localStoragePath = Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetLocalResource("StartupLocalStorage").RootPath;

string fileContent = System.IO.File.ReadAllText(System.IO.Path.Combine(localStoragePath, "MyTestFile.txt"));

Öykünücüde veya bulutta çalıştırma

Başlangıç görevinizin bulutta çalışırken işlem öykünücüsündekiyle karşılaştırıldığında farklı adımlar gerçekleştirmesini sağlayabilirsiniz. Örneğin, SQL verilerinizin yeni bir kopyasını yalnızca öykünücüde çalışırken kullanmak isteyebilirsiniz. Ya da öykünücüde çalışırken bulut için yapmanız gerekmeyen bazı performans iyileştirmeleri yapmak isteyebilirsiniz.

İşlem öykünücüsü ve bulut üzerinde farklı eylemler gerçekleştirme olanağı , ServiceDefinition.csdef dosyasında bir ortam değişkeni oluşturularak gerçekleştirilebilir. Ardından bu ortam değişkenini başlangıç görevinizdeki bir değer için test edebilirsiniz.

Ortam değişkenini oluşturmak için Variable/RoleInstanceValue öğesini ekleyin ve XPath değerini /RoleEnvironment/Deployment/@emulatedoluşturun. %ComputeEmulatorRunning% ortam değişkeninin true değeri, işlem öykünücüsü üzerinde çalışırken ve false bulutta çalışırken kullanılır.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1">

    ...

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>
          <Variable name="ComputeEmulatorRunning">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
        </Environment>
      </Task>
    </Startup>

  </WorkerRole>
</ServiceDefinition>

Görev artık rolün bulutta mı yoksa öykünücüde mi çalıştığına bağlı olarak farklı eylemler gerçekleştirmek için %ComputeEmulatorRunning% ortam değişkenini denetleyebiliyor. Burada, bu ortam değişkenlerini denetleen bir .cmd kabuk betiği yer alır.

REM   Check if this task is running on the compute emulator.

IF "%ComputeEmulatorRunning%" == "true" (
    REM   This task is running on the compute emulator. Perform tasks that must be run only in the compute emulator.
) ELSE (
    REM   This task is running on the cloud. Perform tasks that must be run only in the cloud.
)

Görevinizin zaten çalıştığını algılama

Rol yeniden başlatma olmadan geri dönüştürülebilir ve bu da başlangıç görevlerinizin yeniden çalışmasına neden olabilir. Bir görevin barındırma VM'sinde zaten çalıştığını belirten bir bayrak yok. Birden çok kez çalıştırılmasının önemli olmadığı bazı görevleriniz olabilir. Ancak, bir görevin birden çok kez çalışmasını engellemeniz gereken bir durumla karşılaşabilirsiniz.

Bir görevin zaten çalıştığını algılamanın en basit yolu, görev başarılı olduğunda %TEMP% klasöründe bir dosya oluşturmak ve görevin başında aramaktır. Burada bunu sizin için kullanan örnek bir cmd kabuk betiği verilmiştir.

REM   If Task1_Success.txt exists, then Application 1 is already installed.
IF EXIST "%PathToApp1Install%\Task1_Success.txt" (
  ECHO Application 1 is already installed. Exiting. >> "%TEMP%\StartupLog.txt" 2>&1
  GOTO Finish
)

REM   Run your real exe task
ECHO Running XYZ >> "%TEMP%\StartupLog.txt" 2>&1
"%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

IF %ERRORLEVEL% EQU 0 (
  REM   The application installed without error. Create a file to indicate that the task
  REM   does not need to be run again.

  ECHO This line will create a file to indicate that Application 1 installed correctly. > "%PathToApp1Install%\Task1_Success.txt"

) ELSE (
  REM   An error occurred. Log the error and exit with the error code.

  DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
  TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
  ECHO  An error occurred running task 1. Errorlevel = %ERRORLEVEL%. >> "%TEMP%\StartupLog.txt" 2>&1

  EXIT %ERRORLEVEL%
)

:Finish

REM   Exit normally.
EXIT /B 0

En iyi görev uygulamaları

Web veya çalışan rolünüz için görev yapılandırırken izlemeniz gereken en iyi uygulamalardan bazıları aşağıdadır.

Başlangıç etkinliklerini her zaman günlüğe kaydet

Visual Studio, toplu iş dosyalarında adım adım ilerleyecek bir hata ayıklayıcı sağlamaz, bu nedenle toplu iş dosyalarının işlemiyle ilgili mümkün olduğunca fazla veri almak iyidir. Hem stdout hem de stderr toplu iş dosyalarının çıktısını günlüğe kaydetmek, toplu iş dosyalarının hatalarını ayıklamaya ve düzeltmeye çalışırken size önemli bilgiler verebilir. %TEMP% ortam değişkeninin işaret ettiği dizindeki StartupLog.txt dosyasına hem stdout hem de stderr kaydetmek için, metni >> "%TEMP%\\StartupLog.txt" 2>&1 günlüğe kaydetmek istediğiniz belirli satırların sonuna ekleyin. Örneğin, %PathToApp1Install% dizininde setup.exe yürütmek için: "%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

XML'nizi basitleştirmek için, günlüğe kaydetmeyle birlikte tüm başlangıç görevlerinizi çağıran ve her alt görevin aynı ortam değişkenlerini paylaştığından emin olan bir sarmalayıcı cmd dosyası oluşturabilirsiniz.

Ancak her başlangıç görevinin sonunda kullanmak >> "%TEMP%\StartupLog.txt" 2>&1 can sıkıcı olabilir. Sizin için günlüğe kaydetmeyi işleyen bir sarmalayıcı oluşturarak görev günlüğünü zorunlu kılabilirsiniz. Bu sarmalayıcı çalıştırmak istediğiniz gerçek toplu iş dosyasını çağırır. Hedef toplu iş dosyasındaki tüm çıkışlar Startuplog.txt dosyasına yönlendirilir.

Aşağıdaki örnekte, bir başlangıç toplu iş dosyasındaki tüm çıkışın nasıl yeniden yönlendirildiği gösterilmektedir. Bu örnekte, ServerDefinition.csdef dosyası logwrap.cmd'yi çağıran bir başlangıç görevi oluşturur. logwrap.cmd, Startup2.cmd'yi çağırarak tüm çıkışı %TEMP%\StartupLog.txtöğesine yönlendirir.

ServiceDefinition.cmd:

<Startup>
    <Task commandLine="logwrap.cmd startup2.cmd" executionContext="limited" taskType="simple" />
</Startup>

logwrap.cmd:

@ECHO OFF

REM   logwrap.cmd calls passed in batch file, redirecting all output to the StartupLog.txt log file.

ECHO [%date% %time%] == START logwrap.cmd ============================================== >> "%TEMP%\StartupLog.txt" 2>&1
ECHO [%date% %time%] Running %1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   Call the child command batch file, redirecting all output to the StartupLog.txt log file.
START /B /WAIT %1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   Log the completion of child command.
ECHO [%date% %time%] Done >> "%TEMP%\StartupLog.txt" 2>&1

IF %ERRORLEVEL% EQU 0 (

   REM   No errors occurred. Exit logwrap.cmd normally.
   ECHO [%date% %time%] == END logwrap.cmd ================================================ >> "%TEMP%\StartupLog.txt" 2>&1
   ECHO.  >> "%TEMP%\StartupLog.txt" 2>&1
   EXIT /B 0

) ELSE (

   REM   Log the error.
   ECHO [%date% %time%] An error occurred. The ERRORLEVEL = %ERRORLEVEL%.  >> "%TEMP%\StartupLog.txt" 2>&1
   ECHO [%date% %time%] == END logwrap.cmd ================================================ >> "%TEMP%\StartupLog.txt" 2>&1
   ECHO.  >> "%TEMP%\StartupLog.txt" 2>&1
   EXIT /B %ERRORLEVEL%

)

Startup2.cmd:

@ECHO OFF

REM   This is the batch file where the startup steps should be performed. Because of the
REM   way Startup2.cmd was called, all commands and their outputs will be stored in the
REM   StartupLog.txt file in the directory pointed to by the TEMP environment variable.

REM   If an error occurs, the following command will pass the ERRORLEVEL back to the
REM   calling batch file.

ECHO [%date% %time%] Some log information about this task
ECHO [%date% %time%] Some more log information about this task

EXIT %ERRORLEVEL%

StartupLog.txt dosyasındaki örnek çıktı:

[Mon 10/17/2016 20:24:46.75] == START logwrap.cmd ============================================== 
[Mon 10/17/2016 20:24:46.75] Running command1.cmd 
[Mon 10/17/2016 20:24:46.77] Some log information about this task
[Mon 10/17/2016 20:24:46.77] Some more log information about this task
[Mon 10/17/2016 20:24:46.77] Done 
[Mon 10/17/2016 20:24:46.77] == END logwrap.cmd ================================================ 

İpucu

StartupLog.txt dosyası C:\Resources\temp\{role identifier}\RoleTemp klasöründe bulunur.

executionContext'i başlangıç görevleri için uygun şekilde ayarlama

Başlangıç görevi için ayrıcalıkları uygun şekilde ayarlayın. Bazen rol normal ayrıcalıklarla çalışsa bile başlangıç görevlerinin yükseltilmiş ayrıcalıklarla çalıştırılması gerekir.

executionContext özniteliği, başlangıç görevinin ayrıcalık düzeyini ayarlar. kullanmak executionContext="limited" , başlangıç görevinin rolle aynı ayrıcalık düzeyine sahip olduğu anlamına gelir. kullanma executionContext="elevated" , başlangıç görevinin yönetici ayrıcalıklarına sahip olduğu anlamına gelir ve bu da başlangıç görevinin, rolünüz için yönetici ayrıcalıkları vermeden yönetici görevlerini gerçekleştirmesine olanak tanır.

Yükseltilmiş ayrıcalıklar gerektiren bir başlangıç görevi örneği, IIS'yi yapılandırmak için AppCmd.exe kullanan bir başlangıç görevidir. AppCmd.exe gerektirir executionContext="elevated".

Uygun taskType'ını kullanma

taskType özniteliği, başlangıç görevinin nasıl yürütüleceğini belirler. Üç değer vardır: basit, arka plan ve ön plan. Arka plan ve ön plan görevleri zaman uyumsuz olarak başlatılır ve ardından basit görevler zaman uyumlu olarak birer birer yürütülür.

Basit başlangıç görevleriyle, görevlerin çalıştırıldığı sırayı, görevlerin ServiceDefinition.csdef dosyasında listelenme sırasına göre ayarlayabilirsiniz. Basit bir görev sıfır olmayan bir çıkış koduyla biterse, başlangıç yordamı durdurulur ve rol başlatılmaz.

Arka plan başlangıç görevleriyle ön plan başlangıç görevleri arasındaki fark, ön plan görevleri ön plan görevi sona erene kadar rolü çalışır durumda tutmasıdır. Bu, ön plan görevi yanıt vermemeye veya kilitlenmeye devam ederse, ön plan görevi zorla kapatılana kadar rolün geri dönüştürülmeyeceğini de gösterir. Bu nedenle, ön plan görevinin bu özelliğine ihtiyacınız olmadığı sürece zaman uyumsuz başlangıç görevleri için arka plan görevleri önerilir.

EXIT /B 0 ile toplu iş dosyalarını sonlandırma

Rol yalnızca basit başlangıç görevlerinizin her birinden alınan errorlevel değeri sıfır olduğunda başlar. Tüm programlar errorlevel'i (çıkış kodu) doğru ayarlamaz, bu nedenle toplu iş dosyası her şey düzgün çalıştırılıyorsa ile EXIT /B 0 bitmelidir.

Başlangıç toplu iş dosyasının sonunda eksik EXIT /B 0 olması, başlatılmayan rollerin yaygın bir nedenidir.

Not

İç içe toplu iş dosyalarının bazen parametresini /B kullanırken yanıt vermediğini fark ettim. Başka bir toplu iş dosyası geçerli toplu iş dosyanızı çağırırsa (örneğin , günlük sarmalayıcısını kullanıyorsanız) bu sorunun gerçekleşmediğinden emin olmak isteyebilirsiniz. Bu durumda parametresini /B atlayabilirsiniz.

Başlangıç görevlerinin birden çok kez çalışmasını bekleme

Tüm rol geri dönüşümleri yeniden başlatma içermez, ancak tüm rol geri dönüşümleri tüm başlangıç görevlerini çalıştırmayı içerir. Bu, başlatma görevlerinin yeniden başlatmalar arasında sorunsuz bir şekilde birden çok kez çalıştırılabilmesi gerektiği anlamına gelir. Bu, önceki bölümde açıklanmıştır.

Rolde erişilmesi gereken dosyaları depolamak için yerel depolamayı kullanma

Başlangıç göreviniz sırasında rolünüzün erişebileceği bir dosyayı kopyalamak veya oluşturmak istiyorsanız, bu dosyanın yerel depolama alanına yerleştirilmesi gerekir. Önceki bölüme bakın.

Sonraki adımlar

Bulut hizmeti modelini ve paketini gözden geçirme

Görevlerin nasıl çalıştığı hakkında daha fazla bilgi edinin.

Bulut hizmeti paketinizi oluşturun ve dağıtın.