Delen via


Algemene opstarttaken voor cloudservices (klassiek)

Belangrijk

Cloud Services (klassiek) is vanaf 1 september 2024 afgeschaft voor alle klanten. Bestaande actieve implementaties worden gestopt en afgesloten door Microsoft en de gegevens gaan vanaf oktober 2024 permanant verloren. Nieuwe implementaties moeten gebruikmaken van het nieuwe op Azure Resource Manager gebaseerde implementatiemodel Azure Cloud Services (uitgebreide ondersteuning).

Dit artikel bevat enkele voorbeelden van veelvoorkomende 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 (Component Object Model), het instellen van registersleutels of het starten van een langlopend proces.

Zie dit artikel voor meer informatie over hoe opstarttaken werken en hoe u de vermeldingen maakt die een opstarttaak definiëren.

Notitie

Opstarttaken zijn niet van toepassing op virtuele machines, alleen voor web- en werkrollen in de cloudservice.

Omgevingsvariabelen definiëren voordat een rol wordt gestart

Als u omgevingsvariabelen nodig hebt die zijn gedefinieerd 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>

IIS-opstartproces configureren met AppCmd.exe

Het AppCmd.exe opdrachtregelprogramma kan worden gebruikt voor het beheren van IIS-instellingen (Internet Information Service) bij het opstarten in Azure. AppCmd.exe biedt handige opdrachtregeltoegang tot configuratie-instellingen voor gebruik in opstarttaken in Azure. Wanneer u AppCmd.exe gebruikt, kunnen 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 meerdere keren wordt uitgevoerd, kan er een fout worden gegenereerd. Als u bijvoorbeeld twee keer probeert een sectie toe te voegen aan Web.config , kan er een fout optreden.
  • Opstarttaken mislukken als ze een niet-nul-afsluitcode of foutniveau retourneren. Wanneer AppCmd.exe bijvoorbeeld een fout genereert.

Het is een goede gewoonte om het foutniveau te controleren na het aanroepen van AppCmd.exe, wat eenvoudig te doen is als u de aanroep naar AppCmd.exe met een .cmd-bestand verpakt. Als u een bekend antwoord op foutniveau detecteert, kunt u deze negeren of terugsturen.

De door AppCmd.exe geretourneerde waarden op foutniveau worden vermeld in het bestand winerror.h en kunnen ook worden weergegeven op het Microsoft Developer Network (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 om elevated 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 Startup.cmd batchbestand maakt gebruik van AppCmd.exe om een compressiesectie en een compressievermelding voor JSON toe te voegen aan het Web.config-bestand . Het verwachte foutniveau van 183 is 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 effectief twee firewalls. De eerste firewall beheert verbindingen tussen de virtuele machine en de buitenwereld. Het element EndPoints in het bestand ServiceDefinition.csdef beheert deze firewall.

De tweede firewall beheert verbindingen tussen de virtuele machine en de processen binnen die virtuele machine. U kunt deze firewall beheren via het netsh advfirewall firewall opdrachtregelprogramma.

Azure maakt firewallregels voor de processen die zijn gestart binnen uw rollen. Wanneer u bijvoorbeeld een service of programma start, worden in Azure automatisch de benodigde firewallregels gemaakt om die service te laten communiceren met internet. Als u echter een service maakt die is 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 die een firewallregel maakt, moet een executionContext met 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 in het opstartbatchbestand gebruiken. In dit voorbeeld vereist de opstarttaak beveiliging en versleuteling voor TCP-poort (Transmission Control Protocol) 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 tot 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 u het in uw pakket opneemt.

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 startup.cmd batchbestand wordt uitgevoerd telkens wanneer de webrol wordt geïnitialiseerd, zodat de vereiste ipSecurity-sectie wordt ontgrendeld.

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

Met deze voorbeeldconfiguratie kunnen alle IP-adressen toegang krijgen tot de server, behalve 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 worden alle IP-adressen geweigerd om toegang te krijgen tot de server, 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 (standaard) voert 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 instelling ExecutionPolicy 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 afdwingen dat versie 2 wordt uitgevoerd en als dit niet beschikbaar is, gebruikt u versie 1.

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 vanaf een opstarttaak

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

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 de juiste grootte voor uw opstarttaak.

Als u een lokale opslagresource in uw opstarttaak wilt gebruiken, moet u een omgevingsvariabele maken om te verwijzen 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>

In dit Startup.cmd batchbestand wordt bijvoorbeeld de omgevingsvariabele PathToStartupStorage gebruikt om het bestand te maken MyTest.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 kunt toegang krijgen 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 ervoor zorgen dat uw opstarttaak verschillende stappen uitvoert wanneer deze in de cloud werkt in vergelijking met wanneer deze zich in de rekenemulator bevindt. U kunt bijvoorbeeld alleen een nieuwe kopie van uw SQL-gegevens gebruiken wanneer deze wordt uitgevoerd 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 uitgevoerd 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% wordt true uitgevoerd op de rekenemulator en false bij uitvoering 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 op basis van of de rol wordt uitgevoerd in de cloud of de emulator. Hier volgt een .cmd shellscript dat controleert 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 virtuele hostmachine (VM). Mogelijk hebt u een aantal taken waarbij het niet uitmaakt dat ze meerdere keren worden uitgevoerd. U kunt echter een situatie tegenkomen waarin u wilt 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 geslaagd en deze aan het begin van de taak te zoeken. Hier volgt een voorbeeld van een cmd shell-script dat dat 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 de 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 van fouten en het 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 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

Ter vereenvoudiging van uw XML 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.

Het kan vervelend zijn om aan het einde van elke opstarttaak te gebruiken >> "%TEMP%\StartupLog.txt" 2>&1 . U kunt taaklogboekregistratie afdwingen door een wrapper te maken waarmee logboekregistratie voor u wordt verwerkt. Met deze wrapper wordt het echte batchbestand aanroepen dat u wilt uitvoeren. Uitvoer van het doelbatchbestand wordt omgeleid naar het Startuplog.txt-bestand .

In het volgende voorbeeld ziet u hoe u alle uitvoer van een opstartbatchbestand kunt omleiden. In dit voorbeeld maakt het bestand ServerDefinition.csdef een opstarttaak die logwrap.cmd aanroept. logwrap.cmd roept Startup2.cmd aan, waarbij alle uitvoer wordt omgeleid 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 bestand StartupLog.txt :

[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 bestand StartupLog.txt bevindt zich in de map C:\Resources\temp\{role identifier}\RoleTemp .

ExecutionContext op de juiste wijze instellen voor opstarttaken

Stel bevoegdheden op de juiste wijze in voor de opstarttaak. Soms moeten opstarttaken worden uitgevoerd met verhoogde bevoegdheden, ook al wordt de rol uitgevoerd met normale bevoegdheden.

Het kenmerk executionContext stelt het bevoegdheidsniveau van de opstarttaak in. Dit betekent executionContext="limited" dat de opstarttaak hetzelfde bevoegdheidsniveau heeft als de rol. Dit betekent executionContext="elevated" dat de opstarttaak beheerdersbevoegdheden heeft, waardoor de opstarttaak beheerderstaken kan uitvoeren zonder beheerdersbevoegdheden aan uw rol te geven.

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

Het juiste taskType gebruiken

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

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

Het verschil tussen opstarttaken op de achtergrond en opstarttaken op de voorgrond is dat taken op de voorgrond de rol actief houden totdat de voorgrondtaak eindigt. Deze structuur betekent dat als de voorgrondtaak vastloopt of vastloopt, de rol oncyclik blijft totdat de voorgrondtaak wordt geforceerd gesloten. Daarom worden achtergrondtaken aanbevolen voor asynchrone opstarttaken, tenzij u deze functie van de voorgrondtaak nodig hebt.

Batchbestanden beëindigen met EXIT /B 0

De rol wordt alleen gestart als het foutniveau van elke eenvoudige opstarttaak 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 ontbrekend bestand aan het einde van een opstartbatchbestand is een veelvoorkomende EXIT /B 0 oorzaak van rollen die niet worden gestart.

Notitie

Ik heb gemerkt dat geneste batchbestanden soms niet meer reageren wanneer de /B parameter wordt gebruikt. Mogelijk wilt u ervoor zorgen dat dit probleem zich niet voordoet als een ander batchbestand uw huidige batchbestand aanroept, bijvoorbeeld als u de logboekwikkelaar gebruikt. In dit geval kunt u de /B parameter weglaten.

Verwacht dat opstarttaken meer dan één keer worden uitgevoerd

Niet alle rolrecyclingen omvatten opnieuw opstarten, maar alle rolrecyclings omvatten het uitvoeren van alle opstarttaken. Dit ontwerp betekent dat opstarttaken meerdere keren moeten kunnen worden uitgevoerd tussen opnieuw opstarten zonder problemen, wat wordt besproken in de vorige sectie.

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

Als u een bestand wilt kopiëren of maken tijdens de opstarttaak die 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.