Sdílet prostřednictvím


Běžné úlohy spouštění cloudových služeb (Classic)

Důležité

Od 1. září 2024 je služba Cloud Services (Classic) pro všechny zákazníky zastaralá. Microsoft zastaví a vypne všechna stávající spuštěná nasazení a data se od října 2024 trvale ztratí. Nová nasazení by měla používat nový model nasazení založený na Azure Resource Manageru na Azure Cloud Services (rozšířená podpora).

Tento článek obsahuje některé příklady běžných úloh po spuštění, které můžete chtít provést ve své cloudové službě. Úlohy po spuštění můžete použít k provádění operací před spuštěním role. Mezi operace, které můžete chtít provést, patří instalace komponenty, registrace komponent modelu COM (Component Object Model), nastavení klíčů registru nebo spuštění dlouhotrvajícího procesu.

V tomto článku se dozvíte, jak úlohy po spuštění fungují a konkrétně jak vytvořit položky, které definují spouštěcí úlohu.

Poznámka:

Úlohy po spuštění se nevztahují na virtuální počítače, pouze pro webové role a role pracovního procesu cloudové služby.

Definování proměnných prostředí před zahájením role

Pokud potřebujete proměnné prostředí definované pro konkrétní úlohu, použijte element Environment uvnitř elementu Task .

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

Proměnné můžou také použít platnou hodnotu Azure XPath, která odkazuje na něco o nasazení. Místo použití atributu value definujte podřízený element RoleInstanceValue .

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

Konfigurace spuštění služby IIS pomocí AppCmd.exe

Nástroj příkazového řádku AppCmd.exe lze použít ke správě nastavení internetové informační služby (IIS) při spuštění v Azure. AppCmd.exe poskytuje pohodlný přístup příkazového řádku k nastavení konfigurace pro použití v úlohách po spuštění v Azure. Když používáte AppCmd.exe, můžete přidat, upravit nebo odebrat nastavení webu pro aplikace a weby.

Při použití AppCmd.exe jako spouštěcí úlohy je ale potřeba se podívat na několik věcí:

  • Úlohy po spuštění je možné spustit více než jednou mezi restartováními. Například když role recykluje.
  • Pokud se AppCmd.exe akce provede vícekrát, může se vygenerovat chyba. Například pokus o přidání oddílu do souboru Web.config dvakrát může vygenerovat chybu.
  • Úlohy po spuštění selžou, pokud vrátí nenulový ukončovací kód nebo úroveň chyby. Například když AppCmd.exe vygeneruje chybu.

Doporučujeme zkontrolovat úroveň chyby po volání AppCmd.exe, což se dá snadno provést, pokud volání AppCmd.exe zabalíte do souboru .cmd. Pokud zjistíte známou odpověď na úrovni chyby, můžete ji ignorovat nebo ji předat zpět.

Hodnoty chybové úrovně vrácené AppCmd.exe jsou uvedeny v souboru winerror.h a dají se zobrazit také na webu Microsoft Developer Network (MSDN).

Příklad správy úrovně chyb

V tomto příkladu se do souboru Web.config přidá oddíl komprese a položka komprese JSON s chybovým zpracováním a protokolováním.

Tady jsou uvedeny relevantní části souboru ServiceDefinition.csdef, které zahrnují nastavení atributu executionContext tak, aby elevated AppCmd.exe dostatečná oprávnění ke změně nastavení v souboru Web.config:

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

Dávkový soubor Startup.cmd používá AppCmd.exe k přidání oddílu komprese a položky komprese json do souboru Web.config . Očekávaná úroveň chyby 183 je nastavena na nulu pomocí VERIFY.EXE programu příkazového řádku. Do StartupErrorLog.txt se zaprotokolují neočekávané úrovně chyb.

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%

Přidání pravidel brány firewall

V Azure jsou v podstatě dvě brány firewall. První brána firewall řídí připojení mezi virtuálním počítačem a vnějším světem. Element EndPoints v souboru ServiceDefinition.csdef řídí tuto bránu firewall.

Druhá brána firewall řídí připojení mezi virtuálním počítačem a procesy v rámci daného virtuálního počítače. Tuto bránu firewall můžete řídit pomocí nástroje příkazového netsh advfirewall firewall řádku.

Azure vytváří pravidla brány firewall pro procesy spuštěné v rámci vašich rolí. Když například spustíte službu nebo program, Azure automaticky vytvoří potřebná pravidla brány firewall, která této službě umožní komunikovat s internetem. Pokud však vytvoříte službu spuštěnou procesem mimo vaši roli (například službou MODELU COM+ nebo naplánovanou úlohou Windows), musíte ručně vytvořit pravidlo brány firewall, které povolí přístup k této službě. Tato pravidla brány firewall je možné vytvořit pomocí spouštěcí úlohy.

Spouštěcí úloha, která vytvoří pravidlo brány firewall, musí mít executionContext se zvýšenými oprávněními. Do souboru ServiceDefinition.csdef přidejte následující spouštěcí úlohu.

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

Pokud chcete přidat pravidlo brány firewall, musíte použít příslušné netsh advfirewall firewall příkazy ve spouštěcím dávkovém souboru. V tomto příkladu spouštěcí úloha vyžaduje zabezpečení a šifrování pro port TCP (Transmission Control Protocol) 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%

Blokování konkrétní IP adresy

Přístup k webové roli Azure můžete omezit na sadu zadaných IP adres úpravou souboru IIS web.config . Musíte také použít příkazový soubor, který odemkne část ipSecurity souboru ApplicationHost.config.

Pokud chcete odemknout část ipSecurity souboru ApplicationHost.config, vytvořte soubor příkazu, který se spouští při spuštění role. Vytvořte složku na kořenové úrovni vaší webové role s názvem spuštění a v této složce vytvořte dávkový soubor s názvem startup.cmd. Přidejte tento soubor do projektu sady Visual Studio a nastavte vlastnosti na Kopírovat vždy , abyste měli jistotu, že ho zahrnete do balíčku.

Do souboru ServiceDefinition.csdef přidejte následující spouštěcí úlohu.

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

Přidejte tento příkaz do souboru 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

Tato úloha způsobí spuštění dávkového souboru startup.cmd při každém inicializaci webové role a zajistí odemknutí požadované části ipSecurity .

Nakonec upravte oddíl system.webServer souboru web.config vaší webové role tak, aby se přidal seznam IP adres, které mají udělený přístup, jak je znázorněno v následujícím příkladu:

Tato ukázková konfigurace umožňuje všem IP adresám přístup k serveru s výjimkou dvou definovaných ip adres.

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

Tato ukázková konfigurace odmítne přístup všech IP adres k serveru s výjimkou těchto dvou definovaných IP adres.

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

Vytvoření spouštěcí úlohy PowerShellu

Skripty Prostředí Windows PowerShell nelze volat přímo ze souboru ServiceDefinition.csdef , ale lze je vyvolat z dávkového souboru po spuštění.

PowerShell (ve výchozím nastavení) nespouští nepodepsané skripty. Pokud skript nepodepíšete, musíte powershell nakonfigurovat tak, aby spouštět nepodepsané skripty. Chcete-li spustit nepodepsané skripty, musí být executionPolicy nastavena na Unrestricted. Nastavení ExecutionPolicy , které používáte, je založené na verzi Prostředí 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%

Pokud používáte hostovaný operační systém, na kterém běží PowerShell 2.0 nebo 1.0, můžete vynutit spuštění verze 2 a pokud není k dispozici, použijte verzi 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%

Vytvoření souborů v místním úložišti z úlohy po spuštění

K ukládání souborů vytvořených úlohou po spuštění, ke kterým vaše aplikace později přistupuje, můžete použít místní prostředek úložiště.

Pokud chcete vytvořit prostředek místního úložiště, přidejte do souboru ServiceDefinition.csdef oddíl LocalResources a potom přidejte podřízený element LocalStorage. Dejte místnímu prostředku úložiště jedinečný název a odpovídající velikost pro spouštěcí úlohu.

Pokud chcete ve spouštěcí úloze použít místní prostředek úložiště, musíte vytvořit proměnnou prostředí, která bude odkazovat na umístění místního prostředku úložiště. Spouštěcí úloha a aplikace pak mohou číst a zapisovat soubory do místního prostředku úložiště.

Tady jsou uvedené příslušné části souboru ServiceDefinition.csdef :

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

Například tento dávkový soubor Startup.cmd používá proměnnou prostředí PathToStartupStorage k vytvoření souboru MyTest.txt v umístění místního úložiště.

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

Ke složce místního úložiště můžete přistupovat ze sady Azure SDK pomocí metody GetLocalResource .

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

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

Spuštění v emulátoru nebo cloudu

Spouštěcí úlohu můžete provést v porovnání s tím, kdy je spuštěná v emulátoru výpočetních prostředků, různé kroky. Můžete například chtít použít čerstvou kopii dat SQL pouze při spuštění v emulátoru. Nebo můžete chtít provést některé optimalizace výkonu pro cloud, které nemusíte provádět při spuštění v emulátoru.

Tato schopnost provádět různé akce v emulátoru výpočetních prostředků a cloudu lze provést vytvořením proměnné prostředí v souboru ServiceDefinition.csdef . Pak otestujete tuto proměnnou prostředí pro hodnotu ve spouštěcí úloze.

Chcete-li vytvořit proměnnou prostředí, přidejte proměnnou/RoleInstanceValue element a vytvořte hodnotu XPath ./RoleEnvironment/Deployment/@emulated Hodnota proměnné prostředí %ComputeEmulatorRunning% je true při spuštění v emulátoru výpočetních prostředků a false při spuštění v cloudu.

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

Úloha teď může zkontrolovat proměnnou prostředí %ComputeEmulatorRunning% a provádět různé akce na základě toho, jestli je role spuštěná v cloudu nebo emulátoru. Tady je skript prostředí .cmd, který kontroluje danou proměnnou prostředí.

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

Zjištění, že váš úkol už běží

Role se může recyklovat bez restartování, což způsobí opětovné spuštění úloh po spuštění. Na hostitelském virtuálním počítači už není žádný příznak, který by značil, že úloha už byla spuštěna. Možná máte nějaké úkoly, u kterých nezáleží na tom, že běží vícekrát. Můžete ale narazit na situaci, kdy potřebujete zabránit spuštění úkolu více než jednou.

Nejjednodušší způsob, jak zjistit, že úloha již byla spuštěna, spočívá v vytvoření souboru ve složce %TEMP% , když je úloha úspěšná, a vyhledat ji na začátku úkolu. Tady je ukázkový skript prostředí cmd, který to udělá za vás.

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

Osvědčené postupy pro úlohy

Tady je několik osvědčených postupů, které byste měli dodržovat při konfiguraci úlohy pro webovou roli nebo roli pracovního procesu.

Vždy protokolovat aktivity při spuštění

Visual Studio neposkytuje ladicí program pro procházení dávkových souborů, takže je vhodné získat co nejvíce dat o provozu dávkových souborů. Protokolování výstupu dávkových souborů, stdout i stderr, vám může poskytnout důležité informace při pokusu o ladění a opravu dávkových souborů. Pokud chcete protokolovat soubor stdout i stderr do souboru StartupLog.txt v adresáři, na který odkazuje proměnná prostředí %TEMP% , přidejte text >> "%TEMP%\\StartupLog.txt" 2>&1 na konec konkrétních řádků, které chcete protokolovat. Pokud chcete například spustit setup.exe v adresáři %PathToApp1Install% : "%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

Pro zjednodušení xml můžete vytvořit soubor cmd obálky, který volá všechny úlohy po spuštění spolu s protokolováním a zajišťuje, že každý podřízený úkol sdílí stejné proměnné prostředí.

Může to být nepříjemné, i když použít >> "%TEMP%\StartupLog.txt" 2>&1 na konci každého spouštěcího úkolu. Protokolování úloh můžete vynutit vytvořením obálky, která za vás zpracovává protokolování. Tento obálka volá skutečný dávkový soubor, který chcete spustit. Jakýkoli výstup z cílového dávkového souboru se přesměruje na Startuplog.txt soubor.

Následující příklad ukazuje, jak přesměrovat veškerý výstup ze spouštěcího dávkového souboru. V tomto příkladu vytvoří soubor ServerDefinition.csdef spouštěcí úlohu, která volá logwrap.cmd. logwrap.cmd volání Startup2.cmd přesměrování veškerého výstupu na %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%

Ukázkový výstup v souboru 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

Soubor StartupLog.txt se nachází ve složce C:\Resources\temp\{identifikátor role}\RoleTemp .

Správně nastavit executionContext pro úlohy po spuštění

Nastavte oprávnění pro spouštěcí úlohu. Někdy se úlohy po spuštění musí spouštět se zvýšenými oprávněními, i když se role spouští s normálními oprávněními.

Atribut executionContext nastaví úroveň oprávnění spouštěcí úlohy. Použití executionContext="limited" znamená, že spouštěcí úloha má stejnou úroveň oprávnění jako role. Použití executionContext="elevated" znamená, že spouštěcí úloha má oprávnění správce, což umožňuje spouštěcí úloze provádět úlohy správce bez udělení oprávnění správce vaší roli.

Příkladem spouštěcí úlohy, která vyžaduje zvýšená oprávnění, je spouštěcí úloha, která ke konfiguraci služby IIS používá AppCmd.exe . AppCmd.exe vyžaduje executionContext="elevated".

Použití příslušného typu úkolu

Atribut taskType určuje způsob spuštění úlohy. Existují tři hodnoty: jednoduché, pozadí a popředí. Úlohy na pozadí a popředí se spouští asynchronně a potom se jednoduché úlohy provádějí synchronně po jednom.

Pomocí jednoduchých spouštěcích úloh můžete nastavit pořadí, ve kterém se úlohy spouští podle pořadí, ve kterém jsou úlohy uvedeny v souboru ServiceDefinition.csdef. Pokud jednoduchý úkol končí nenulovým ukončovacím kódem, zastaví se spouštěcí procedura a role se nespustí.

Rozdíl mezi spouštěcími úkoly na pozadí a úkoly po spuštění na popředí spočívá v tom, že úlohy popředí udržují roli spuštěnou, dokud úkol popředí nekončí. Tato struktura znamená, že pokud úloha popředí přestane reagovat nebo dojde k chybovému ukončení, zůstane role nevyřčená, dokud nebude úkol popředí nuceně uzavřen. Z tohoto důvodu se úlohy na pozadí doporučují pro asynchronní spouštěcí úlohy, pokud tuto funkci úlohy popředí nepotřebujete.

Ukončení dávkových souborů pomocí příkazu EXIT /B 0

Role se spustí pouze v případě, že je úroveň chyby z každé jednoduché spouštěcí úlohy nulová. Ne všechny programy správně nastavily chybovou úroveň (ukončovací kód), takže dávkové soubory by měly končit EXIT /B 0 , pokud všechno běžel správně.

Chybějící EXIT /B 0 na konci dávkového souboru po spuštění je běžnou příčinou rolí, které se nespustí.

Poznámka:

Všiml(a) jsem si, že vnořené dávkové soubory někdy přestanou reagovat při použití parametru /B . Můžete se ujistit, že k tomuto problému nedochází, pokud váš aktuální dávkový soubor volá jiný dávkový soubor, například pokud používáte obálku protokolu. V tomto případě můžete parametr vynechat /B .

Očekává, že se úlohy po spuštění spustí více než jednou.

Ne všechny recyklace rolí zahrnují restartování, ale všechny recyklace rolí zahrnují spuštění všech úloh po spuštění. Tento návrh znamená, že úlohy po spuštění musí být mezi restartováními spuštěny vícekrát bez jakýchkoli problémů, což je popsáno v předchozí části.

Použití místního úložiště k ukládání souborů, ke kterým je potřeba přistupovat v roli

Pokud chcete zkopírovat nebo vytvořit soubor během spouštěcí úlohy, která je pak přístupná pro vaši roli, musí být tento soubor umístěn v místním úložišti. Viz předchozí část.

Další kroky

Kontrola modelu a balíčku cloudové služby

Přečtěte si další informace o tom, jak úkoly fungují.

Vytvořte a nasaďte balíček cloudové služby.