Common Cloud Service (klasszikus) indítási feladatok

Fontos

Cloud Services (klasszikus) mostantól elavult az új ügyfelek számára, és 2024. augusztus 31-én minden ügyfél esetében megszűnik. Az új üzemelő példányoknak az új Azure Resource Manager-alapú Azure Cloud Services (kiterjesztett támogatás) üzemi modellt kell használniuk.

Ez a cikk néhány példát mutat be a felhőszolgáltatásban végrehajtandó gyakori indítási feladatokra. Indítási feladatokkal műveleteket hajthat végre a szerepkör indítása előtt. A végrehajtandó műveletek közé tartozik egy összetevő telepítése, COM-összetevők regisztrálása, beállításkulcsok beállítása vagy egy hosszú ideig futó folyamat elindítása.

Ebből a cikkből megtudhatja, hogyan működnek az indítási feladatok, és hogyan hozhatja létre az indítási feladatokat meghatározó bejegyzéseket.

Megjegyzés

Az indítási feladatok nem alkalmazhatók Virtual Machines, csak a Cloud Service webes és feldolgozói szerepköreire.

Környezeti változók definiálása szerepkör indítása előtt

Ha egy adott tevékenységhez környezeti változókat kell definiálnia, használja a Tevékenység elem környezeti elemét.

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

A változók egy érvényes Azure XPath-érték használatával is hivatkozhatnak az üzembe helyezéssel kapcsolatos valamire. Az attribútum használata value helyett definiáljon egy RoleInstanceValue gyermekelemet.

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

IIS-indítás konfigurálása a AppCmd.exe

A AppCmd.exe parancssori eszköz az IIS-beállítások azure-beli indításkor történő kezelésére használható. AppCmd.exe kényelmes, parancssori hozzáférést biztosít a konfigurációs beállításokhoz az Azure-beli indítási feladatokhoz. A AppCmd.exehasználatával a webhely beállításai hozzáadhatók, módosíthatók vagy eltávolíthatók az alkalmazásokhoz és webhelyekhez.

A AppCmd.exe indítási feladatként való használatakor azonban érdemes figyelni néhány dologra:

  • Az indítási feladatok az újraindítások között többször is futtathatók. Például amikor egy szerepkör újraindul.
  • Ha egy AppCmd.exe műveletet többször hajtanak végre, az hibát okozhat. Ha például megpróbál hozzáadni egy szakaszt Web.config kétszer, hibát okozhat.
  • Az indítási feladatok meghiúsulnak, ha nem nulla kilépési kódot vagy hibaszintet adnak vissza. Ha például AppCmd.exe hibát generál.

Érdemes ellenőrizni a hibaszintetAppCmd.exehívása után, ami könnyen elvégezhető, ha a hívást egy .cmd fájllal burkoljaAppCmd.exe. Ha ismert hibaszintű választ észlel, figyelmen kívül hagyhatja, vagy visszaküldheti.

A AppCmd.exe által visszaadott hibaszint szerepel a winerror.h fájlban, és az MSDN-en is látható.

Példa a hibaszint kezelésére

Ez a példa egy tömörítési szakaszt és egy JSON-tömörítési bejegyzést ad hozzá aWeb.configfájlhoz hibakezeléssel és naplózással.

Itt láthatók a ServiceDefinition.csdef fájl megfelelő szakaszai, amelyek magukban foglalják az executionContext attribútum beállítását, hogy elevated megfelelő engedélyeket adjanakAppCmd.exea Web.config fájl beállításainak módosításához:

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

A Startup.cmd kötegfájl AppCmd.exe használ egy tömörítési szakasz és egy JSON-bejegyzés hozzáadásához a Web.config fájlhoz. A várt 183-as hibaszint nullára van állítva a VERIFY.EXE parancssori program használatával. A rendszer váratlan hibaszinteket naplóz a 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%

Tűzfalszabályok hozzáadása

Az Azure-ban gyakorlatilag két tűzfal található. Az első tűzfal szabályozza a virtuális gép és a külvilág közötti kapcsolatokat. Ezt a tűzfalat a ServiceDefinition.csdef fájl EndPoints eleme vezérli.

A második tűzfal szabályozza a virtuális gép és a virtuális gépen belüli folyamatok közötti kapcsolatokat. Ezt a tűzfalat a parancssori netsh advfirewall firewall eszköz vezérelheti.

Az Azure tűzfalszabályokat hoz létre a szerepkörökben elindított folyamatokhoz. Amikor például elindít egy szolgáltatást vagy programot, az Azure automatikusan létrehozza a szükséges tűzfalszabályokat, hogy a szolgáltatás kommunikálhasson az internettel. Ha azonban a szerepkörén kívüli folyamat (például COM+ szolgáltatás vagy Windows ütemezett feladat) által indított szolgáltatást hoz létre, manuálisan kell létrehoznia egy tűzfalszabályt a szolgáltatáshoz való hozzáférés engedélyezéséhez. Ezek a tűzfalszabályok indítási feladattal hozhatók létre.

A tűzfalszabályt létrehozó indítási feladatnak emelt szintűexecutionContext paraméterrel kell rendelkeznie. Adja hozzá a következő indítási feladatot a ServiceDefinition.csdef fájlhoz.

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

A tűzfalszabály hozzáadásához a megfelelő netsh advfirewall firewall parancsokat kell használnia az indítási kötegfájlban. Ebben a példában az indítási feladat biztonsági és titkosítási műveletet igényel a 80-s TCP-porton.

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%

Adott IP-cím blokkolása

Az IIS -web.config fájl módosításával korlátozhatja az Azure-beli webes szerepkörök hozzáférését a megadott IP-címek halmazára. Egy parancsfájlt is használnia kell, amely feloldja a ApplicationHost.config fájl ipSecurity szakaszát.

A ApplicationHost.config fájl ipSecurity szakaszának feloldásához hozzon létre egy parancsfájlt, amely a szerepkör indításakor fut. Hozzon létre egy indítás nevű mappát a webes szerepkör gyökérszintjén, és ebben a mappában hozzon létre egy startup.cmd nevű kötegelt fájlt. Adja hozzá ezt a fájlt a Visual Studio projekthez, és állítsa a tulajdonságokat a Copy Always értékre, hogy biztosan szerepeljen a csomagban.

Adja hozzá a következő indítási feladatot a ServiceDefinition.csdef fájlhoz.

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

Adja hozzá ezt a parancsot a startup.cmd fájlhoz :

@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

Ez a feladat a startup.cmd kötegfájl futtatását eredményezi a webes szerepkör minden inicializálásakor, biztosítva, hogy a szükséges ipSecurity szakasz feloldva legyen.

Végül módosítsa a system.webServer szakaszt a webes szerepkör web.config fájljára, hogy hozzáadja a hozzáférést biztosító IP-címek listáját az alábbi példában látható módon:

Ez a mintakonfiguráció lehetővé teszi , hogy az összes IP-cím hozzáférjen a kiszolgálóhoz a két meghatározott kivételével

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

Ez a mintakonfiguráció a két megadott kivételével minden IP-címet letilt a kiszolgáló elérésében.

<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 indítási feladat létrehozása

Windows PowerShell parancsfájlok nem hívhatók meg közvetlenül a ServiceDefinition.csdef fájlból, de indítási kötegfájlból hívhatók meg.

A PowerShell (alapértelmezés szerint) nem futtat aláíratlan szkripteket. Ha nem írja alá a szkriptet, konfigurálnia kell a PowerShellt az aláíratlan szkriptek futtatására. Aláíratlan szkriptek futtatásához az ExecutionPolicy tulajdonságot Korlátlan értékre kell állítani. A használt ExecutionPolicy beállítás a Windows PowerShell verzióján alapul.

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%

Ha PowerShell 2.0-t vagy 1.0-t futtató vendég operációs rendszert használ, kényszerítheti a 2-es verzió futtatását, és ha nem érhető el, használja az 1-es verziót.

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%

Fájlok létrehozása helyi tárolóban indítási feladatból

Helyi tárolási erőforrással tárolhatja az indítási feladat által létrehozott fájlokat, amelyeket az alkalmazás később érhet el.

A helyi tárolási erőforrás létrehozásához adjon hozzá egy LocalResources szakaszt a ServiceDefinition.csdef fájlhoz, majd adja hozzá a LocalStorage gyermekelemet. Adjon egyedi nevet és méretet a helyi tárolási erőforrásnak az indítási feladathoz.

Ha helyi tárolási erőforrást szeretne használni az indítási feladatban, létre kell hoznia egy környezeti változót, amely a helyi tárolási erőforrás helyére hivatkozik. Ezután az indítási feladat és az alkalmazás képes fájlokat olvasni és írni a helyi tárolási erőforrásba.

A ServiceDefinition.csdef fájl vonatkozó szakaszai itt láthatók:

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

Ez a Startup.cmd kötegfájl például a PathToStartupStorage környezeti változóval hozza létre a fájl MyTest.txt a helyi tárolóhelyen.

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

A helyi tárolómappát a GetLocalResource metódussal érheti el az Azure SDK-ból.

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

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

Futtatás az emulátorban vagy a felhőben

Az indítási feladat különböző lépéseket hajthat végre, amikor a felhőben működik, mint a számítási emulátorban. Előfordulhat például, hogy a SQL adatok friss másolatát csak az emulátorban való futtatáskor szeretné használni. Vagy érdemes lehet olyan teljesítményoptimalizálást végeznie a felhőben, amelyet nem kell elvégeznie az emulátorban való futtatáskor.

A számítási emulátor és a felhő különböző műveleteinek végrehajtásához létre kell hozni egy környezeti változót a ServiceDefinition.csdef fájlban. Ezután tesztelheti a környezeti változót az indítási feladatban szereplő érték alapján.

A környezeti változó létrehozásához adja hozzá a VariableRoleInstanceValue/ elemet, és hozza létre a /RoleEnvironment/Deployment/@emulatedkövetkező XPath-értékét: . A %ComputeEmulatorRunning% környezeti változó true értéke a számítási emulátoron való futtatáskor és false a felhőben való futtatáskor van.

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

A feladat most már ellenőrizheti a %ComputeEmulatorRunning% környezeti változót, hogy különböző műveleteket hajthat végre attól függően, hogy a szerepkör a felhőben vagy az emulátorban fut-e. Íme egy .cmd rendszerhéj-szkript, amely ellenőrzi a környezeti változót.

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

Észleli, hogy a tevékenység már fut

Előfordulhat, hogy a szerepkör újraindítás nélkül újraindul, és az indítási feladatok újra futnak. Nincs olyan jelző, amely azt jelezheti, hogy egy feladat már futott a gazda virtuális gépen. Előfordulhat, hogy vannak olyan tevékenységei, amelyekben nem számít, hogy többször is futnak. Előfordulhat azonban, hogy egy feladat többszöri futtatását meg kell akadályoznia.

A legegyszerűbben úgy észlelheti, hogy egy feladat már lefutott, ha létrehoz egy fájlt a %TEMP% mappában, ha a feladat sikeres, és a feladat elején keresi. Íme egy parancshéj-példaszkript, amely elvégzi ezt Az Ön számára.

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

Ajánlott eljárások a tevékenységekhez

Íme néhány ajánlott eljárás, amelyeket érdemes követnie a webes vagy feldolgozói szerepkör feladatának konfigurálásakor.

Indítási tevékenységek naplózása mindig

Visual Studio nem biztosít hibakeresőt a kötegelt fájlokon való végiglépéshez, ezért érdemes minél több adatot lekérni a kötegelt fájlok működéséről. A kötegelt fájlok kimenetének naplózása ( stdout és stderr) fontos információkat nyújthat a kötegelt fájlok hibakeresése és javítása során. Ha az stdoutot és az stderrt is a %TEMP% környezeti változó által hivatkozott könyvtárban lévő StartupLog.txt fájlba szeretné naplózni, adja hozzá a szöveget >> "%TEMP%\\StartupLog.txt" 2>&1 a naplózni kívánt sorok végéhez. Például setup.exe végrehajtása a %PathToApp1Install% könyvtárban: "%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

Az XML egyszerűsítése érdekében létrehozhat egy burkoló parancsfájlt , amely meghívja az összes indítási feladatot a naplózással együtt, és biztosítja, hogy minden gyermekfeladat ugyanazokat a környezeti változókat ossza meg.

Előfordulhat, hogy bosszantónak találja az egyes indítási feladatok végén történő használatot >> "%TEMP%\StartupLog.txt" 2>&1 . A feladatnaplózást úgy kényszerítheti ki, hogy létrehoz egy burkolót, amely kezeli a naplózást. Ez a burkoló meghívja a futtatni kívánt valódi kötegelt fájlt. A célkötegfájl kimenete a Startuplog.txt fájlba lesz átirányítva.

Az alábbi példa bemutatja, hogyan irányíthatja át az összes kimenetet egy indítási kötegfájlból. Ebben a példában a ServerDefinition.csdef fájl létrehoz egy indítási feladatot, amely meghívja a logwrap.cmd fájlt. A logwrap.cmd meghívja a Startup2.cmd fájlt, és átirányítja az összes kimenetet a következőre: %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%

Mintakimenet a StartupLog.txt fájlban:

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

Tipp

A StartupLog.txt fájl a C:\Resources\temp\{role identifier}\RoleTemp mappában található.

A executionContext megfelelő beállítása indítási feladatokhoz

Állítsa be az indítási feladathoz megfelelő jogosultságokat. Néha az indítási feladatoknak emelt szintű jogosultságokkal kell futniuk, annak ellenére, hogy a szerepkör normál jogosultságokkal fut.

A executionContext attribútum beállítja az indítási feladat jogosultsági szintjét. A használat executionContext="limited" azt jelenti, hogy az indítási feladat jogosultsági szintje megegyezik a szerepkörével. Ez executionContext="elevated" azt jelenti, hogy az indítási feladat rendszergazdai jogosultságokkal rendelkezik, ami lehetővé teszi, hogy az indítási feladat rendszergazdai feladatokat végezzen anélkül, hogy rendszergazdai jogosultságokat ad az Ön szerepkörének.

Emelt szintű jogosultságot igénylő indítási feladatokra példa egy indítási feladat, amely AppCmd.exe használ az IIS konfigurálásához. AppCmd.exe szükséges executionContext="elevated".

A megfelelő taskType használata

A taskType attribútum határozza meg az indítási feladat végrehajtását. Három érték létezik: egyszerű, háttér és előtér. A háttér- és az előtérben lévő tevékenységek aszinkron módon indulnak el, majd az egyszerű feladatok végrehajtása egyenként történik.

Egyszerű indítási feladatok esetén beállíthatja, hogy a feladatok a ServiceDefinition.csdef fájlban megadott sorrendben fussanak. Ha egy egyszerű feladat nem nulla kilépési kóddal végződik, az indítási eljárás leáll, és a szerepkör nem indul el.

A háttérbeli indítási és az előtér-indítási feladatok között az a különbség, hogy az előtérbeli tevékenységek addig futnak, amíg az előtér-tevékenység véget nem ér. Ez azt is jelenti, hogy ha az előtér-tevékenység lefagy vagy összeomlik, a szerepkör nem lesz újrahasznosítva, amíg az előtér-tevékenység nincs bezárva. Ezért a háttérfeladatok az aszinkron indítási feladatokhoz ajánlottak, kivéve, ha az előtérben lévő feladatnak erre a funkciójára van szüksége.

Kötegelt fájlok befejezése az EXIT /B 0 használatával

A szerepkör csak akkor indul el, ha az egyes egyszerű indítási feladatok hibaszintje nulla. Nem minden program állítja be helyesen a hibaszintet (kilépési kódot), ezért a kötegfájlnak akkor kell végződnie, EXIT /B 0 ha minden megfelelően futott.

EXIT /B 0 Az indítási kötegfájl végén hiányzó szerepkörök gyakori oka, hogy nem indulnak el.

Megjegyzés

Észrevettem, hogy a beágyazott kötegelt fájlok néha nem válaszolnak a /B paraméter használatakor. Érdemes lehet meggyőződni arról, hogy ez a probléma nem fordul elő, ha egy másik kötegelt fájl hívja meg az aktuális kötegfájlt, például ha a naplóburkolót használja. Ebben az esetben kihagyhatja a /B paramétert.

Indítási feladatok többszöri futtatásának várható

Nem minden szerepkör-újrahasznosítás tartalmaz újraindítást, de minden szerepkör-újrahasznosítás tartalmazza az összes indítási feladat futtatását. Ez azt jelenti, hogy az indítási feladatoknak több alkalommal is futniuk kell az újraindítások között probléma nélkül. Ezt az előző szakaszban tárgyaljuk.

A szerepkörben elérendő fájlok tárolása helyi tároló használatával

Ha az indítási feladat során olyan fájlt szeretne másolni vagy létrehozni, amely ezután elérhető a szerepkör számára, akkor a fájlt a helyi tárolóba kell helyezni. Lásd az előző szakaszt.

Következő lépések

A felhőszolgáltatási modell és csomag áttekintése

További információ a feladatok működéséről.

Felhőszolgáltatás-csomag létrehozása és üzembe helyezése .