A Cloud Service (klasszikus) indítási feladatai

Fontos

Cloud Services (klasszikus) mostantól elavult az új ügyfelek számára, és 2024. augusztus 31-én minden ügyfél számára megszűnik. Az új üzemelő példányoknak az új Azure Resource Manager-alapú Azure Cloud Services (kiterjesztett támogatás) üzembehelyezési 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. Az 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 például egy összetevő telepítése, a COM-összetevők regisztrálása, a 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 tevékenységet meghatározó bejegyzéseket.

Megjegyzés

Az indítási feladatok nem alkalmazhatók a Virtual Machines, csak a Felhőszolgáltatás 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ókra van szüksége, használja a Tevékenység elem Környezet 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ékkel is hivatkozhatnak az üzembe helyezéssel kapcsolatban. Az value attribútum használata 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 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 az Azure-beli indítási feladatokhoz használható konfigurációs beállításokhoz. A AppCmd.exehasználatával a webhely beállításai hozzáadhatók, módosíthatók vagy eltávolíthatók alkalmazásokhoz és webhelyekhez.

A AppCmd.exe indítási feladatként való használatakor azonban érdemes odafigyelni 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 újrafeldolgozik.
  • Ha egy AppCmd.exe műveletet többször hajtanak végre, az hibát okozhat. Ha például megpróbál egy szakaszt hozzáadni Web.config kétszer, hibát okozhat.
  • Az indítási feladatok sikertelenek, 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 hibaszintet a AppCmd.exehívása után, ami könnyen elvégezhető, ha a hívást egy .cmd fájlba csomagoljaAppCmd.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 a executionContext attribútum beállítását, hogy elevatedAppCmd.exe megfelelő engedélyeket adjanak a 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ötegelt fájl AppCmd.exe használ egy tömörítési szakasz és egy JSON-tömörítési 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 létezik. 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 olyan szolgáltatást hoz létre, amelyet a szerepkörén kívüli folyamat (például COM+ szolgáltatás vagy Windows ütemezett feladat) indít el, 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űvégrehajtási kontextussal 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 feladathoz biztonságra és titkosításra van szükség a 80-s TCP-porthoz.

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 letiltá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. Olyan 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 elején fut. Hozzon létre egy mappát a webes szerepkör indítás nevű gyökérszintjén, és ebben a mappában hozzon létre egy startup.cmd nevű kötegfá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 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 webszerepkör web.config fájljához, 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álás lehetővé teszi , hogy az összes IP-cím hozzáférjen a kiszolgálóhoz, kivéve a két definiált

<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álás a két definiált kivételével minden IP-címet letilt a kiszolgáló eléréséhez.

<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 szkriptek nem hívhatók meg közvetlenül a ServiceDefinition.csdef fájlból, de egy 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ához. Az aláíratlan szkriptek futtatásához a ExecutionPolicy beállítást 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-s vagy 1.0-s verzió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 ér 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ó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 a helyi tárolási erőforrás helyére való hivatkozáshoz. 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ájlt a helyi tárolóhelyen MyTest.txt .

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 az SQL-adatok friss másolatát csak akkor szeretné használni, ha az emulátorban fut. Vagy érdemes lehet elvégezni néhány teljesítményoptimalizálást a felhőhöz, amelyet nem kell elvégeznie az emulátorban való futtatáskor.

Ez a képesség a számítási emulátoron és a felhőn végzett különböző műveletek végrehajtásához létrehozhat egy környezeti változót a ServiceDefinition.csdef fájlban. Ezután teszteli 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 Változó/RoleInstanceValue elemet, és hozzon létre egy XPath-értéket./RoleEnvironment/Deployment/@emulated 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, és 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éjszkript, 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.
)

Annak észlelése, hogy a tevékenység már lefutott

Előfordulhat, hogy a szerepkör újraindítás nélkül újraindul, és az indítási feladatok újrafutnak. Nincs olyan jelző, amely azt jelezheti, hogy egy feladat már fut a üzemeltetési virtuális gépen. Előfordulhat, hogy vannak olyan feladatok, 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 tevékenység már lefutott, ha létrehoz egy fájlt a %TEMP% mappában, amikor a feladat sikeres, és a tevékenység elején keresi. Íme egy példa cmd shell-szkriptre, amely ezt teszi 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 feladatokhoz

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

Mindig naplózza az indítási tevékenységeket

A Visual Studio nem biztosít hibakeresőt a kötegelt fájlokon való lé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 stdout és az stderr fájlt is naplózni szeretné a könyvtár %TEMP% környezeti változója által mutatott StartupLog.txt fájlba, adja hozzá a szöveget >> "%TEMP%\\StartupLog.txt" 2>&1 a naplózni kívánt sorok végéhez. Például a %PathToApp1Install% könyvtárban setup.exe végrehajtásához: "%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 használja.

Előfordulhat, hogy bosszantónak találja, ha az egyes indítási feladatok végén használja >> "%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ötegfá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 parancsot, é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 a megfelelő jogosultságokat az indítási feladathoz. 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álata executionContext="limited" azt jelenti, hogy az indítási feladat jogosultsági szintje megegyezik a szerepkörével. A használata 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ágokat igénylő indítási feladat például egy indítási feladat, amely AppCmd.exe használ az IIS konfigurálásához. AppCmd.exe megköveteli a parancsot 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 előtérfeladatok aszinkron módon indulnak el, majd az egyszerű feladatok végrehajtása szinkronban 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 feladatok és az előtérbeli indítási feladatok között az a különbség, hogy az előtérbeli feladatok addig futnak, amíg az előtérbeli tevékenység véget nem ér. Ez azt is jelenti, hogy ha az előtérbeli tevékenység lefagy vagy összeomlik, a szerepkör csak akkor lesz újraindul, ha az előtérbeli tevékenység bezárul. Ezért a háttérfeladatok 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 egy-egy EXIT /B 0 értékkel kell végződnie, ha minden megfelelően futott.

A nem induló szerepkörök gyakori oka, hogy egy indítási kötegfájl végén hiányzik EXIT /B 0 .

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ötegfájl meghívja 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-lomtár tartalmaz újraindítást, de minden szerepkör-újrahasznosítás magában foglalja az összes indítási feladat futtatását. Ez azt jelenti, hogy az indítási feladatoknak probléma nélkül többször is futniuk kell az újraindítások között. 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

Tekintse át a felhőszolgáltatási modellt és -csomagot

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

Hozza létre és helyezze üzembe a felhőszolgáltatás-csomagot.