Opstarttaken van Common Cloud Service (klassiek)

Belangrijk

Cloud Services (klassiek) is nu afgeschaft voor nieuwe klanten en wordt op 31 augustus 2024 voor alle klanten buiten gebruik gesteld. Nieuwe implementaties moeten gebruikmaken van het nieuwe op Azure Resource Manager gebaseerde implementatiemodel Azure Cloud Services (uitgebreide ondersteuning).

Dit artikel bevat enkele voorbeelden van algemene opstarttaken die u mogelijk wilt uitvoeren in uw cloudservice. U kunt opstarttaken gebruiken om bewerkingen uit te voeren voordat een rol wordt gestart. Bewerkingen die u mogelijk wilt uitvoeren, zijn onder andere het installeren van een onderdeel, het registreren van COM-onderdelen, het instellen van registersleutels of het starten van een langlopend proces.

Zie dit artikel voor meer informatie over de werking van opstarttaken en met name over het maken van de vermeldingen waarmee een opstarttaak wordt gedefinieerd.

Notitie

Opstarttaken zijn niet van toepassing op Virtual Machines, alleen op cloudserviceweb- en werkrollen.

Omgevingsvariabelen definiëren voordat een rol wordt gestart

Als u omgevingsvariabelen wilt definiëren voor een specifieke taak, gebruikt u het element Omgeving in het element Taak .

<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>

Variabelen kunnen ook een geldige Azure XPath-waarde gebruiken om te verwijzen naar iets over de implementatie. In plaats van het value kenmerk te gebruiken, definieert u een onderliggend element RoleInstanceValue .

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

Opstarten van IIS configureren met AppCmd.exe

Het opdrachtregelprogrammaAppCmd.exe kan worden gebruikt voor het beheren van IIS-instellingen bij het opstarten in Azure. AppCmd.exe biedt handige opdrachtregeltoegang tot configuratie-instellingen voor gebruik in opstarttaken in Azure. Met behulp vanAppCmd.exekunnen website-instellingen worden toegevoegd, gewijzigd of verwijderd voor toepassingen en sites.

Er zijn echter een paar dingen om op te letten bij het gebruik van AppCmd.exe als opstarttaak:

  • Opstarttaken kunnen meerdere keren worden uitgevoerd tussen het opnieuw opstarten. Bijvoorbeeld wanneer een rol wordt gerecycled.
  • Als een AppCmd.exe actie meer dan één keer wordt uitgevoerd, kan er een fout optreden. Als u bijvoorbeeld twee keer probeert een sectie toe te voegen aan Web.config , kan dit een fout veroorzaken.
  • Opstarttaken mislukken als ze een niet-nul afsluitcode of foutniveau retourneren. Bijvoorbeeld wanneer AppCmd.exe een fout genereert.

Het is een goede gewoonte om het foutniveau te controleren nadat uAppCmd.exehebt aangeroepen. Dit is eenvoudig als u de aanroep naar AppCmd.exe verpakt met een CMD-bestand . Als u een bekend antwoord op foutniveau detecteert, kunt u deze negeren of teruggeven.

Het foutniveau dat wordt geretourneerd door AppCmd.exe worden vermeld in het bestand winerror.h en kan ook worden weergegeven op MSDN.

Voorbeeld van het beheren van het foutniveau

In dit voorbeeld wordt een compressiesectie en een compressievermelding voor JSON toegevoegd aan het Web.config-bestand , met foutafhandeling en logboekregistratie.

De relevante secties van het bestand ServiceDefinition.csdef worden hier weergegeven, waaronder het instellen van het kenmerk executionContext op elevated om AppCmd.exe voldoende machtigingen te geven om de instellingen in het Web.config-bestand te wijzigen:

<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>

Het batchbestand Startup.cmd gebruikt AppCmd.exe om een compressiesectie en een compressievermelding voor JSON toe te voegen aan het Web.config-bestand . Het verwachte foutniveau van 183 wordt ingesteld op nul met behulp van het VERIFY.EXE opdrachtregelprogramma. Onverwachte foutniveaus worden vastgelegd in StartupErrorLog.txt.

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%

Firewallregels toevoegen

In Azure zijn er in feite twee firewalls. De eerste firewall beheert verbindingen tussen de virtuele machine en de buitenwereld. Deze firewall wordt beheerd door het element EndPoints in het bestand ServiceDefinition.csdef .

De tweede firewall beheert verbindingen tussen de virtuele machine en de processen binnen die virtuele machine. Deze firewall kan worden beheerd door het netsh advfirewall firewall opdrachtregelprogramma.

Azure maakt firewallregels voor de processen die binnen uw rollen zijn gestart. Wanneer u bijvoorbeeld een service of programma start, maakt Azure automatisch de benodigde firewallregels om die service toe te staan met internet te communiceren. Als u echter een service maakt die wordt gestart door een proces buiten uw rol (zoals een COM+-service of een geplande Windows-taak), moet u handmatig een firewallregel maken om toegang tot die service toe te staan. Deze firewallregels kunnen worden gemaakt met behulp van een opstarttaak.

Een opstarttaak waarmee een firewallregel wordt gemaakt, moet een executionContext van verhoogde bevoegdheden hebben. Voeg de volgende opstarttaak toe aan het bestand ServiceDefinition.csdef .

<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>

Als u de firewallregel wilt toevoegen, moet u de juiste netsh advfirewall firewall opdrachten gebruiken in het opstartbatchbestand. In dit voorbeeld vereist de opstarttaak beveiliging en versleuteling voor TCP-poort 80.

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%

Een specifiek IP-adres blokkeren

U kunt de toegang van een Azure-webrol beperken tot een set opgegeven IP-adressen door uw IIS -web.config-bestand te wijzigen. U moet ook een opdrachtbestand gebruiken waarmee de sectie ipSecurity van het ApplicationHost.config-bestand wordt ontgrendeld.

Als u de sectie ipSecurity van het ApplicationHost.config-bestand wilt ontgrendelen, maakt u een opdrachtbestand dat wordt uitgevoerd bij het starten van de rol. Maak een map op het hoofdniveau van uw webrol met de naam opstarten en maak in deze map een batchbestand met de naam startup.cmd. Voeg dit bestand toe aan uw Visual Studio-project en stel de eigenschappen in op Altijd kopiëren om ervoor te zorgen dat het is opgenomen in uw pakket.

Voeg de volgende opstarttaak toe aan het bestand ServiceDefinition.csdef .

<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>

Voeg deze opdracht toe aan het bestand startup.cmd :

@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

Deze taak zorgt ervoor dat het batchbestand startup.cmd elke keer wordt uitgevoerd wanneer de webrol wordt geïnitialiseerd, zodat de vereiste sectie ipSecurity wordt ontgrendeld.

Wijzig ten slotte de sectie system.webServer van het web.config-bestand van uw webrol om een lijst met IP-adressen toe te voegen die toegang krijgen, zoals wordt weergegeven in het volgende voorbeeld:

Met deze voorbeeldconfiguratie hebben alle IP-adressen toegang tot de server, met uitzondering van de twee gedefinieerde

<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>

Met deze voorbeeldconfiguratie wordt de toegang tot de server voor alle IP-adressen geweigerd, met uitzondering van de twee gedefinieerde.

<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>

Een PowerShell-opstarttaak maken

Windows PowerShell scripts kunnen niet rechtstreeks worden aangeroepen vanuit het bestand ServiceDefinition.csdef, maar ze kunnen worden aangeroepen vanuit een opstartbatchbestand.

PowerShell voert (standaard) geen niet-ondertekende scripts uit. Tenzij u uw script ondertekent, moet u PowerShell configureren om niet-ondertekende scripts uit te voeren. Als u niet-ondertekende scripts wilt uitvoeren, moet ExecutionPolicy zijn ingesteld op Onbeperkt. De executionPolicy-instelling die u gebruikt, is gebaseerd op de versie van Windows PowerShell.

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%

Als u een gastbesturingssysteem gebruikt waarop PowerShell 2.0 of 1.0 wordt uitgevoerd, kunt u versie 2 afdwingen en, indien niet beschikbaar, versie 1 gebruiken.

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%

Bestanden maken in lokale opslag van een opstarttaak

U kunt een lokale opslagresource gebruiken om bestanden op te slaan die zijn gemaakt door uw opstarttaak en die later door uw toepassing worden geopend.

Als u de lokale opslagresource wilt maken, voegt u een sectie LocalResources toe aan het bestand ServiceDefinition.csdef en voegt u vervolgens het onderliggende element LocalStorage toe. Geef de lokale opslagresource een unieke naam en een geschikte grootte voor uw opstarttaak.

Als u een lokale opslagresource wilt gebruiken in uw opstarttaak, moet u een omgevingsvariabele maken die verwijst naar de locatie van de lokale opslagresource. Vervolgens kunnen de opstarttaak en de toepassing bestanden lezen en schrijven naar de lokale opslagresource.

De relevante secties van het bestand ServiceDefinition.csdef worden hier weergegeven:

<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>

Dit batchbestand Startup.cmd gebruikt bijvoorbeeld de omgevingsvariabele PathToStartupStorage om het bestand te makenMyTest.txt op de lokale opslaglocatie.

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

U hebt toegang tot de lokale opslagmap vanuit de Azure SDK met behulp van de methode GetLocalResource .

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

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

Uitvoeren in de emulator of cloud

U kunt uw opstarttaak andere stappen laten uitvoeren wanneer deze in de cloud wordt uitgevoerd, vergeleken met wanneer deze zich in de rekenemulator bevindt. U kunt bijvoorbeeld alleen een nieuwe kopie van uw SQL-gegevens gebruiken wanneer u deze uitvoert in de emulator. Of misschien wilt u prestatieoptimalisaties uitvoeren voor de cloud die u niet hoeft te doen bij het uitvoeren in de emulator.

Deze mogelijkheid om verschillende acties uit te voeren op de rekenemulator en de cloud kan worden bereikt door een omgevingsvariabele te maken in het bestand ServiceDefinition.csdef . Vervolgens test u die omgevingsvariabele voor een waarde in uw opstarttaak.

Als u de omgevingsvariabele wilt maken, voegt u het element Variable/RoleInstanceValue toe en maakt u een XPath-waarde van /RoleEnvironment/Deployment/@emulated. De waarde van de omgevingsvariabele %ComputeEmulatorRunning% is true wanneer wordt uitgevoerd op de rekenemulator en false wanneer deze wordt uitgevoerd in de cloud.

<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>

De taak kan nu de omgevingsvariabele %ComputeEmulatorRunning% controleren om verschillende acties uit te voeren, afhankelijk van of de rol wordt uitgevoerd in de cloud of de emulator. Hier volgt een .cmd-shellscript waarmee wordt gecontroleerd op die omgevingsvariabele.

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.
)

Detecteren dat uw taak al is uitgevoerd

De rol kan worden gerecycled zonder opnieuw opstarten, waardoor uw opstarttaken opnieuw worden uitgevoerd. Er is geen vlag om aan te geven dat een taak al is uitgevoerd op de host-VM. Mogelijk hebt u taken waarbij het niet uitmaakt dat ze meerdere keren worden uitgevoerd. Het kan echter gebeuren dat u moet voorkomen dat een taak meer dan één keer wordt uitgevoerd.

De eenvoudigste manier om te detecteren dat een taak al is uitgevoerd, is door een bestand te maken in de map %TEMP% wanneer de taak is voltooid en deze aan het begin van de taak te zoeken. Hier volgt een voorbeeld van een cmd shell-script dat dit voor u doet.

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

Aanbevolen procedures voor taken

Hier volgen enkele aanbevolen procedures die u moet volgen bij het configureren van een taak voor uw web- of werkrol.

Opstartactiviteiten altijd registreren

Visual Studio biedt geen foutopsporingsprogramma om batchbestanden te doorlopen, dus het is goed om zoveel mogelijk gegevens over de werking van batchbestanden op te halen. Het vastleggen van de uitvoer van batchbestanden, zowel stdout als stderr, kan u belangrijke informatie geven bij het opsporen en oplossen van batchbestanden. Als u zowel stdout als stderr wilt vastleggen in het StartupLog.txt-bestand in de map waarnaar wordt verwezen door de omgevingsvariabele %TEMP% , voegt u de tekst >> "%TEMP%\\StartupLog.txt" 2>&1 toe aan het einde van de specifieke regels die u wilt vastleggen. Als u bijvoorbeeld setup.exe wilt uitvoeren in de map %PathToApp1Install% : "%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

Om uw XML te vereenvoudigen, kunt u een wrapper-cmd-bestand maken dat al uw opstarttaken aanroept, samen met logboekregistratie en ervoor zorgt dat elke onderliggende taak dezelfde omgevingsvariabelen deelt.

Misschien vindt u het vervelend om aan het einde van elke opstarttaak te gebruiken >> "%TEMP%\StartupLog.txt" 2>&1 . U kunt taaklogboekregistratie afdwingen door een wrapper te maken die de logboekregistratie voor u verwerkt. Met deze wrapper wordt het echte batchbestand aangeroepen dat u wilt uitvoeren. Alle uitvoer van het doelbatchbestand wordt omgeleid naar het Startuplog.txt-bestand .

In het volgende voorbeeld ziet u hoe u alle uitvoer van een opstartbatchbestand omleidt. In dit voorbeeld maakt het bestand ServerDefinition.csdef een opstarttaak die logwrap.cmd aanroept. logwrap.cmd roept Startup2.cmd aan en leidt alle uitvoer om naar %TEMP%\StartupLog.txt.

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%

Voorbeelduitvoer in het StartupLog.txt-bestand :

[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 ================================================ 

Tip

Het StartupLog.txt-bestand bevindt zich in de map C:\Resources\temp\{role identifier}\RoleTemp .

ExecutionContext op de juiste manier instellen voor opstarttaken

Stel de juiste bevoegdheden in voor de opstarttaak. Soms moeten opstarttaken worden uitgevoerd met verhoogde bevoegdheden, zelfs als de rol wordt uitgevoerd met normale bevoegdheden.

Met het kenmerk executionContext wordt het bevoegdheidsniveau van de opstarttaak ingesteld. Dit executionContext="limited" betekent dat de opstarttaak hetzelfde bevoegdheidsniveau heeft als de rol. Dit executionContext="elevated" betekent dat de opstarttaak beheerdersbevoegdheden heeft, waardoor de opstarttaak beheerderstaken kan uitvoeren zonder beheerdersbevoegdheden voor uw rol te verlenen.

Een voorbeeld van een opstarttaak waarvoor verhoogde bevoegdheden zijn vereist, is een opstarttaak die gebruikmaakt vanAppCmd.exe om IIS te configureren. voorAppCmd.exe is vereist executionContext="elevated".

Het juiste taskType gebruiken

Het kenmerk taskType bepaalt de manier waarop de opstarttaak wordt uitgevoerd. Er zijn drie waarden: eenvoudig, achtergrond en voorgrond. De achtergrond- en voorgrondtaken worden asynchroon gestart en vervolgens worden de eenvoudige taken één voor één synchroon uitgevoerd.

Met eenvoudige opstarttaken kunt u de volgorde instellen waarin de taken worden uitgevoerd volgens de volgorde waarin de taken worden vermeld in het bestand ServiceDefinition.csdef. Als een eenvoudige taak eindigt met een afsluitcode die niet nul is, wordt de opstartprocedure gestopt en wordt de rol niet gestart.

Het verschil tussen opstarttaken op de achtergrond en opstarttaken op de voorgrond is dat voorgrondtaken de rol actief houden totdat de voorgrondtaak eindigt. Dit betekent ook dat als de voorgrondtaak vastloopt of vastloopt, de rol pas wordt gerecycled als de voorgrondtaak wordt gesloten. Daarom worden achtergrondtaken aanbevolen voor asynchrone opstarttaken, tenzij u die functie van de voorgrondtaak nodig hebt.

Batchbestanden beëindigen met EXIT /B 0

De rol wordt alleen gestart als het foutniveau van elk van uw eenvoudige opstarttaken nul is. Niet alle programma's stellen het foutniveau (afsluitcode) correct in, dus het batchbestand moet eindigen met een EXIT /B 0 als alles correct is uitgevoerd.

Een ontbrekende EXIT /B 0 aan het einde van een opstartbatchbestand is een veelvoorkomende oorzaak van rollen die niet worden gestart.

Notitie

Het is me opgevallen dat geneste batchbestanden soms niet meer reageren wanneer de /B parameter wordt gebruikt. Mogelijk wilt u ervoor zorgen dat dit probleem niet optreedt als een ander batchbestand uw huidige batchbestand aanroept, bijvoorbeeld als u de logboekwrapping gebruikt. In dit geval kunt u de /B parameter weglaten.

Verwacht dat opstarttaken meer dan één keer worden uitgevoerd

Niet alle recyclen van rollen bevatten opnieuw opstarten, maar alle rolrecycles omvatten het uitvoeren van alle opstarttaken. Dit betekent dat opstarttaken zonder problemen meerdere keren moeten kunnen worden uitgevoerd tussen het opnieuw opstarten. Dit wordt besproken in de vorige sectie.

Lokale opslag gebruiken om bestanden op te slaan die moeten worden geopend in de rol

Als u tijdens de opstarttaak een bestand wilt kopiëren of maken dat vervolgens toegankelijk is voor uw rol, moet dat bestand in de lokale opslag worden geplaatst. Zie de vorige sectie.

Volgende stappen

Het cloudservicemodel en -pakket controleren

Meer informatie over hoe taken werken.

Maak en implementeer uw cloudservicepakket.