Attività di avvio comuni del servizio cloudCommon Cloud Service startup tasks

Questo articolo fornisce alcuni esempi relativi alle attività di avvio comuni che è possibile eseguire nel servizio cloud.This article provides some examples of common startup tasks you may want to perform in your cloud service. È possibile usare le attività di avvio per eseguire operazioni prima dell'avvio di un ruolo.You can use startup tasks to perform operations before a role starts. Le operazioni che si possono eseguire sono l'installazione di un componente, la registrazione dei componenti COM, l'impostazione delle chiavi del Registro di sistema o l'avvio di un processo a esecuzione prolungata.Operations that you might want to perform include installing a component, registering COM components, setting registry keys, or starting a long running process.

Per comprendere il funzionamento delle attività di avvio e in particolare la modalità di creazione delle voci che definiscono un'attività di avvio, vedere questo articolo .See this article to understand how startup tasks work, and specifically how to create the entries that define a startup task.

Nota

Le attività di avvio non sono applicabili ai ruoli VM, ma solo ai ruoli Web e di lavoro del servizio cloud.Startup tasks are not applicable to Virtual Machines, only to Cloud Service Web and Worker roles.

Definire le variabili di ambiente prima dell'avvio di un ruoloDefine environment variables before a role starts

Se si devono definire le variabili di ambiente per un'attività specifica, usare l'elemento Environment all'interno dell'elemento Task.If you need environment variables defined for a specific task, use the Environment element inside the Task element.

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

Le variabili possono inoltre usare un valore XPath di Azure valido per fare riferimento a un elemento della distribuzione.Variables can also use a valid Azure XPath value to reference something about the deployment. Anziché usare l'attributo value , definire un elemento figlio RoleInstanceValue .Instead of using the value attribute, define a RoleInstanceValue child element.

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

Configurare l'avvio IIS con AppCmd.exeConfigure IIS startup with AppCmd.exe

Lo strumento da riga di comando AppCmd.exe può essere usato per gestire le impostazioni IIS all'avvio in Azure.The AppCmd.exe command-line tool can be used to manage IIS settings at startup on Azure. AppCmd.exe offre un comodo accesso da riga di comando alle impostazioni di configurazione da usare nelle attività di avvio in Azure.AppCmd.exe provides convenient, command-line access to configuration settings for use in startup tasks on Azure. Tramite AppCmd.exeè possibile aggiungere, modificare o rimuovere impostazioni per applicazioni e siti Web.Using AppCmd.exe, Website settings can be added, modified, or removed for applications and sites.

È necessario tuttavia tenere conto di alcuni aspetti se si usa AppCmd.exe come attività di avvio:However, there are a few things to watch out for in the use of AppCmd.exe as a startup task:

  • Le attività di avvio possono essere eseguite più di una volta tra un riavvio e l'altro.Startup tasks can be run more than once between reboots. Ad esempio, quando un ruolo viene riciclato.For instance, when a role recycles.
  • Se eseguita più volte, l'azione AppCmd.exe potrebbe generare un errore.If a AppCmd.exe action is performed more than once, it may generate an error. Ad esempio, il tentativo di aggiungere due volte una sezione a Web.config potrebbe generare un errore.For example, attempting to add a section to Web.config twice could generate an error.
  • Le attività di avvio danno esito negativo se restituiscono un codice di uscita o un valore di errorleveldiverso da zero.Startup tasks fail if they return a non-zero exit code or errorlevel. Ad esempio, quando AppCmd.exe genera un errore.For example, when AppCmd.exe generates an error.

È consigliabile controllare il valore di errorlevel dopo la chiamata di AppCmd.exe, operazione semplice se si esegue il wrapping della chiamata a AppCmd.exe con un file con estensione .cmd.It is a good practice to check the errorlevel after calling AppCmd.exe, which is easy to do if you wrap the call to AppCmd.exe with a .cmd file. Se si rileva un valore di errorlevel noto, è possibile ignorarlo oppure restituirlo.If you detect a known errorlevel response, you can ignore it, or pass it back.

Il valore di errorlevel restituito da AppCmd.exe è elencato nel file winerror.h e può essere visualizzato anche in MSDN.The errorlevel returned by AppCmd.exe are listed in the winerror.h file, and can also be seen on MSDN.

Esempio di gestione del livello di erroreExample of managing the error level

In questo esempio vengono aggiunte una sezione di compressione e una voce di compressione per JSON al file Web.config , con gestione e registrazione degli errori.This example adds a compression section and a compression entry for JSON to the Web.config file, with error handling and logging.

Le sezioni pertinenti del file ServiceDefinition.csdef sono riportate di seguito, evidenziando l'impostazione dell'attributo executionContext su elevated per fornire ad AppCmd.exe le autorizzazioni sufficienti per modificare le impostazioni nel file Web.config:The relevant sections of the ServiceDefinition.csdef file are shown here, which include setting the executionContext attribute to elevated to give AppCmd.exe sufficient permissions to change the settings in the Web.config file:

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

Nel file batch Startup.cmd viene usato AppCmd.exe per aggiungere una sezione di compressione e una voce di compressione per JSON al file Web.config.The Startup.cmd batch file uses AppCmd.exe to add a compression section and a compression entry for JSON to the Web.config file. Il valore di errorlevel previsto di 183 viene impostato su zero tramite il programma da riga di comando VERIFY.EXE.The expected errorlevel of 183 is set to zero using the VERIFY.EXE command-line program. I valori di errorlevel imprevisti vengono registrati in StartupErrorLog.txt.Unexpected errorlevels are logged to 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 a 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 DO 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%

Aggiungere regole di firewallAdd firewall rules

In Azure sono disponibili due firewall.In Azure, there are effectively two firewalls. Il primo controlla le connessioni tra la macchina virtuale e il mondo esterno.The first firewall controls connections between the virtual machine and the outside world. Questa funzionalità è controllata dall'elemento EndPoints nel file ServiceDefinition.csdef.This firewall is controlled by the EndPoints element in the ServiceDefinition.csdef file.

Il secondo controlla le connessioni tra la macchina virtuale e i processi al suo interno.The second firewall controls connections between the virtual machine and the processes within that virtual machine. Questo firewall può essere controllato tramite lo strumento della riga di comando netsh advfirewall firewall.This firewall can be controlled by the netsh advfirewall firewall command-line tool.

In Azure vengono create regole di firewall per i processi avviati nei ruoli.Azure creates firewall rules for the processes started within your roles. Quando si avvia un servizio o un programma, ad esempio, in Azure vengono create automaticamente le regole di firewall necessarie per consentire la comunicazione del servizio con Internet.For example, when you start a service or program, Azure automatically creates the necessary firewall rules to allow that service to communicate with the Internet. Tuttavia, se si crea un servizio che viene avviato da un processo esterno al ruolo, come un servizio COM+ o un'attività pianificata di Windows, è necessario creare manualmente una regola di firewall per consentire l'accesso al servizio.However, if you create a service that is started by a process outside your role (like a COM+ service or a Windows Scheduled Task), you need to manually create a firewall rule to allow access to that service. Queste regole di firewall possono essere create usando un'attività di avvio.These firewall rules can be created by using a startup task.

In un'attività di avvio che crea una regola di firewall l'attributo executionContext deve essere impostato su elevato diverso da zero.A startup task that creates a firewall rule must have an executionContext of elevated. Aggiungere l'attività di avvio seguente per il file ServiceDefinition.csdef .Add the following startup task to the ServiceDefinition.csdef file.

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

Per aggiungere la regola di firewall, è necessario usare i comandi netsh advfirewall firewall appropriati nel file batch di avvio.To add the firewall rule, you must use the appropriate netsh advfirewall firewall commands in your startup batch file. In questo esempio l'attività di avvio richiede la sicurezza e la crittografia per la porta TCP 80.In this example, the startup task requires security and encryption for TCP port 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%

Bloccare un indirizzo IP specificoBlock a specific IP address

È possibile limitare l'accesso di un ruolo Web di Azure a un set di indirizzi IP specifici modificando il file web.config IIS.You can restrict an Azure web role access to a set of specified IP addresses by modifying your IIS web.config file. È anche necessario usare un file di comando per lo sblocco della sezione ipSecurity del file ApplicationHost.config.You also need to use a command file which unlocks the ipSecurity section of the ApplicationHost.config file.

Per sbloccare la sezione ipSecurity del file ApplicationHost.config, creare un file di comando da eseguire all'avvio del ruolo.To do unlock the ipSecurity section of the ApplicationHost.config file, create a command file that runs at role start. Creare una cartella al livello radice del ruolo Web denominata startup e crearvi un file batch denominato startup.cmd.Create a folder at the root level of your web role called startup and, within this folder, create a batch file called startup.cmd. Aggiungere il file al progetto di Visual Studio e impostare le proprietà su Copia sempre per assicurarsi che sia incluso nel pacchetto.Add this file to your Visual Studio project and set the properties to Copy Always to ensure that it is included in your package.

Aggiungere l'attività di avvio seguente per il file ServiceDefinition.csdef .Add the following startup task to the ServiceDefinition.csdef file.

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

Aggiungere questo comando al file startup.cmd :Add this command to the startup.cmd file:

@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

In questo modo il file batch startup.cmd viene eseguito ogni volta che il ruolo Web viene inizializzato, assicurando lo sblocco della sezione ipSecurity.This task causes the startup.cmd batch file to be run every time the web role is initialized, ensuring that the required ipSecurity section is unlocked.

Modificare infine la sezione system.webServer section del file web.config del ruolo Web in modo da aggiungere un elenco di indirizzi IP a cui viene concesso l'accesso, come illustrato nell'esempio seguente:Finally, modify the system.webServer section your web role’s web.config file to add a list of IP addresses that are granted access, as shown in the following example:

Questa configurazione di esempio consente l'accesso al server a tutti gli indirizzi IP, a eccezione dei due IP definitiThis sample config allows all IPs to access the server except the two defined

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

Questa configurazione di esempio nega l'accesso al server a tutti gli indirizzi IP, a eccezione dei due IP definiti.This sample config denies all IPs from accessing the server except for the two defined.

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

Creare un'attività di avvio di PowerShellCreate a PowerShell startup task

Gli script di Windows PowerShell non possono essere chiamati direttamente dal file ServiceDefinition.csdef , ma possono essere richiamati da un file batch di avvio.Windows PowerShell scripts cannot be called directly from the ServiceDefinition.csdef file, but they can be invoked from within a startup batch file.

Per impostazione predefinita, in PowerShell non vengono eseguiti script non firmati.PowerShell (by default) does not run unsigned scripts. Se non si firmano gli script, PowerShell deve essere configurato per eseguire script non firmati.Unless you sign your script, you need to configure PowerShell to run unsigned scripts. Per eseguire script non firmati, ExecutionPolicy deve essere impostato su Unrestricted.To run unsigned scripts, the ExecutionPolicy must be set to Unrestricted. L'impostazione di ExecutionPolicy da usare dipende dalla versione di Windows PowerShell.The ExecutionPolicy setting that you use is based on the version of 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%

Se si usa un sistema operativo Guest che esegue PowerShell 2.0 o 1.0, è possibile forzare l'esecuzione della versione 2 e, se non è disponibile, usare la versione 1.If you're using a Guest OS that is runs PowerShell 2.0 or 1.0 you can force version 2 to run, and if unavailable, use version 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%

Creare file nell'archiviazione locale da un'attività di avvioCreate files in local storage from a startup task

È possibile usare una risorsa di archiviazione locale per archiviare i file creati dall'attività di avvio a cui l'applicazione accederà in seguito.You can use a local storage resource to store files created by your startup task that is accessed later by your application.

Per creare la risorsa di archiviazione locale, aggiungere una sezione LocalResources al file ServiceDefinition.csdef e quindi aggiungere l'elemento figlio LocalStorage.To create the local storage resource, add a LocalResources section to the ServiceDefinition.csdef file and then add the LocalStorage child element. Assegnare alla risorsa di archiviazione locale un nome univoco e una dimensione appropriata per l'attività di avvio.Give the local storage resource a unique name and an appropriate size for your startup task.

Per usare una risorsa di archiviazione locale nell'attività di avvio, è necessario creare una variabile di ambiente che faccia riferimento al percorso della risorsa di archiviazione locale.To use a local storage resource in your startup task, you need to create an environment variable to reference the local storage resource location. In questo modo l'attività di avvio e l'applicazione sono in grado di leggere e scrivere i file nella risorsa di archiviazione locale.Then the startup task and the application are able to read and write files to the local storage resource.

Le sezioni pertinenti del file ServiceDefinition.csdef sono riportate di seguito:The relevant sections of the ServiceDefinition.csdef file are shown here:

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

Nel file batch Startup.cmd viene usata la variabile di ambiente PathToStartupStorage per creare il file MyTest.txt nel percorso di archiviazione locale.As an example, this Startup.cmd batch file uses the PathToStartupStorage environment variable to create the file MyTest.txt on the local storage location.

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

È possibile accedere alla cartella di archiviazione locale da Azure SDK usando il metodo GetLocalResource.You can access local storage folder from the Azure SDK by using the GetLocalResource method.

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

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

Esecuzione nell'emulatore o nel cloudRun in the emulator or cloud

È possibile impostare l'attività di avvio in modo che esegua passaggi diversi a seconda che venga usata nel cloud o nell'emulatore di calcolo.You can have your startup task perform different steps when it is operating in the cloud compared to when it is in the compute emulator. È ad esempio possibile decidere di usare una copia aggiornata dei dati SQL solo quando l'esecuzione avviene nell'emulatore.For example, you may want to use a fresh copy of your SQL data only when running in the emulator. In alternativa, è possibile eseguire dei passaggi di ottimizzazione delle prestazioni nel cloud che non sono necessari quando l'esecuzione avviene nell'emulatore.Or you may want to do some performance optimizations for the cloud that you don't need to do when running in the emulator.

Per eseguire nell'emulatore di calcolo azioni diverse da quelle eseguite nel cloud, è necessario creare una variabile di ambiente nel file ServiceDefinition.csdefThis ability to perform different actions on the compute emulator and the cloud can be accomplished by creating an environment variable in the ServiceDefinition.csdef file. e testare la variabile di ambiente su un valore durante l'attività di avvio.You then test that environment variable for a value in your startup task.

Per creare la variabile di ambiente, aggiungere l'elemento Variable/RoleInstanceValue e creare un valore XPath di /RoleEnvironment/Deployment/@emulated.To create the environment variable, add the Variable/RoleInstanceValue element and create an XPath value of /RoleEnvironment/Deployment/@emulated. Il valore della variabile di ambiente %ComputeEmulatorRunning% è true durante l'esecuzione nell'emulatore di calcolo e false durante l'esecuzione nel cloud.The value of the %ComputeEmulatorRunning% environment variable is true when running on the compute emulator, and false when running on the 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>

È ora possibile usare la variabile di ambiente %ComputeEmulatorRunning% in qualsiasi esecuzione di attività per eseguire azioni diverse a seconda che il ruolo sia in esecuzione nel cloud o nell'emulatore.The task can now check the %ComputeEmulatorRunning% environment variable to perform different actions based on whether the role is running in the cloud or the emulator. Di seguito è riportato uno script shell con estensione cmd che controlla la variabile di ambiente.Here is a .cmd shell script that checks for that environment variable.

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

Rilevare se l'attività è già stata eseguitaDetect that your task has already run

Il ruolo può essere riciclato senza riavvio, causando una nuova esecuzione dell'attività di avvio.The role may recycle without a reboot causing your startup tasks to run again. Non esistono flag che indichino che un'attività è già stata eseguita nella macchina virtuale di hosting.There is no flag to indicate that a task has already run on the hosting VM. Per alcune attività non è importante se l'esecuzione avviene più volte.You may have some tasks where it doesn't matter that they run multiple times. Potrebbe tuttavia verificarsi una situazione in cui è necessario impedire l'esecuzione ripetuta di un'attività.However, you may run into a situation where you need to prevent a task from running more than once.

Il modo più semplice per rilevare se un'attività è già stata eseguita consiste nel creare un file nella cartella %TEMP% quando l'attività ha esito positivo e cercarlo all'inizio dell'attività.The simplest way to detect that a task has already run is to create a file in the %TEMP% folder when the task is successful and look for it at the start of the task. Di seguito è riportato uno script shell con estensione cmd di esempio che esegue automaticamente questa operazione.Here is a sample cmd shell script that does that for you.

REM   If Task1_Success.txt exists, then Application 1 is already installed.
IF EXIST "%RoleRoot%\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. > "%RoleRoot%\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

Procedure consigliate per l'attivitàTask best practices

Di seguito sono riportate alcune procedure consigliate da seguire durante la configurazione dell'attività per il ruolo Web o di lavoro.Here are some best practices you should follow when configuring task for your web or worker role.

Registrare sempre le attività di avvioAlways log startup activities

In Visual Studio non è previsto un debugger per analizzare i file batch, pertanto è buona pratica ottenere quanti più dati possibile sul funzionamento di tali file.Visual Studio does not provide a debugger to step through batch files, so it's good to get as much data on the operation of batch files as possible. La registrazione dell'output dei file batch, sia stdout che stderr, può fornire informazioni importanti quando si tenta di eseguire il debug e correggere i file batch.Logging the output of batch files, both stdout and stderr, can give you important information when trying to debug and fix batch files. Per registrare sia stdout che stderr nel file StartupLog.txt nella directory a cui fa riferimento la variabile di ambiente %TEMP%, aggiungere il testo >> "%TEMP%\\StartupLog.txt" 2>&1 alla fine delle righe specifiche che si desidera registrare.To log both stdout and stderr to the StartupLog.txt file in the directory pointed to by the %TEMP% environment variable, add the text >> "%TEMP%\\StartupLog.txt" 2>&1 to the end of specific lines you want to log. Ad esempio, per eseguire setup.exe nella directory %PathToApp1Install% :For example, to execute setup.exe in the %PathToApp1Install% directory:

"%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

Per semplificare il xml, è possibile creare un file wrapper cmd che chiama tutte le attività di avvio insieme alla registrazione e assicura che ogni attività figlio condivida le stesse variabili di ambiente.To simplify your xml, you can create a wrapper cmd file that calls all of your startup tasks along with logging and ensures each child-task shares the same environment variables.

Può risultare fastidioso usare >> "%TEMP%\StartupLog.txt" 2>&1 al termine di ogni attività di avvio.You may find it annoying though to use >> "%TEMP%\StartupLog.txt" 2>&1 on the end of each startup task. È possibile applicare la registrazione dell'attività tramite la creazione di un wrapper che gestisce la registrazione al posto dell'utente.You can enforce task logging by creating a wrapper that handles logging for you. Il wrapper chiama il file batch reale che si desidera eseguire.This wrapper calls the real batch file you want to run. L'output del file batch di destinazione verrà reindirizzato sul file Startuplog.txt.Any output from the target batch file will be redirected to the Startuplog.txt file.

Di seguito viene fornito un esempio che illustra come reindirizzare tutto l'output di un file batch di avvio.The following example shows how to redirect all output from a startup batch file. In questo esempio il file ServerDefinition.csdef crea un'attività di avvio che chiama logwrap.cmd.In this example, the ServerDefinition.csdef file creates a startup task that calls logwrap.cmd. logwrap.cmd chiama Startup2.cmd, reindirizzando tutto l'output a %TEMP%\StartupLog.txt.logwrap.cmd calls Startup2.cmd, redirecting all output to %TEMP%\StartupLog.txt.

ServiceDefinition.cmd:ServiceDefinition.cmd:

<Startup>
    <Task commandLine="logwrap.cmd startup2.cmd" executionContext="limited" taskType="simple" />
</Startup>

logwrap.cmd: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: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%

Esempio di output nel file StartupLog.txt:Sample output in the StartupLog.txt file:

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

Suggerimento

Il file StartupLog.txt si trova nella cartella C:\Resources\temp\{identificatore ruolo}\RoleTemp.The StartupLog.txt file is located in the C:\Resources\temp\{role identifier}\RoleTemp folder.

Impostare l'attributo executionContext in modo appropriato per le attività di avvioSet executionContext appropriately for startup tasks

Impostare i privilegi in modo appropriato per l'attività di avvio.Set privileges appropriately for the startup task. In alcuni casi le attività di avvio devono essere eseguite con privilegi elevati anche se il ruolo viene eseguito con privilegi normali.Sometimes startup tasks must run with elevated privileges even though the role runs with normal privileges.

Lo strumento da riga di comando executionContext imposta il livello di privilegio dell'attività di avvio.The executionContext attribute sets the privilege level of the startup task. L'uso di executionContext="limited" indica che l'attività di avvio dispone dello stesso livello di privilegio del ruolo.Using executionContext="limited" means the startup task has the same privilege level as the role. L'uso di executionContext="elevated" indica che l'attività di avvio dispone di privilegi di amministratore, cioè potrà eseguire attività amministrative, senza fornire privilegi di amministratore al ruolo.Using executionContext="elevated" means the startup task has administrator privileges, which allows the startup task to perform administrator tasks without giving administrator privileges to your role.

Un esempio di attività di avvio che richiede privilegi elevati è un'attività di avvio che usa AppCmd.exe per configurare IIS.An example of a startup task that requires elevated privileges is a startup task that uses AppCmd.exe to configure IIS. AppCmd.exe richiede executionContext="elevated".AppCmd.exe requires executionContext="elevated".

Usare l'attributo taskType appropriatoUse the appropriate taskType

Lo strumento da riga di comando taskType determina la modalità di esecuzione dell'attività di avvio.The taskType attribute determines the way the startup task is executed. Sono disponibili tre valori: simple, background e foreground.There are three values: simple, background, and foreground. Le attività in background e in primo piano (foreground) vengono avviate in modo asincrono e le attività semplici (simple) vengono eseguite in modo sincrono una alla volta.The background and foreground tasks are started asynchronously, and then the simple tasks are executed synchronously one at a time.

Con le attività di avvio simple è possibile impostare l'ordine in cui le attività si verificano in base all'ordine in cui le attività sono elencate nel file ServiceDefinition.csdef.With simple startup tasks, you can set the order in which the tasks run by the order in which the tasks are listed in the ServiceDefinition.csdef file. Se un'attività simple termina con un codice di uscita diverso da zero, la procedura di avvio viene arrestata e il ruolo non viene avviato.If a simple task ends with a non-zero exit code, then the startup procedure stops and the role does not start.

La differenza tra le attività di avvio background e foreground è che le attività foreground mantengono il ruolo in esecuzione fino alla fine dell'attività foreground.The difference between background startup tasks and foreground startup tasks is that foreground tasks keep the role running until the foreground task ends. Questo significa anche che se l'attività foreground si blocca o viene arrestata in modo anomalo, il ruolo non verrà riciclato fino alla chiusura forzata dell'attività foreground.This also means that if the foreground task hangs or crashes, the role will not recycle until the foreground task is forced closed. Per questo motivo, il tipo background è consigliato per le attività di avvio asincrono, a meno che non siano necessarie le funzionalità dell'attività di tipo foreground.For this reason, background tasks are recommended for asynchronous startup tasks unless you need that feature of the foreground task.

Terminare i file batch con EXIT /B 0End batch files with EXIT /B 0

Il ruolo verrà avviato solo se il valore di errorlevel di ognuna delle attività di avvio semplici è uguale a zero.The role will only start if the errorlevel from each of your simple startup task is zero. Non in tutti i programmi il valore di errorlevel (codice di uscita) viene impostato correttamente, per cui se l'esecuzione è avvenuta correttamente il file batch deve terminare con un comando EXIT /B 0.Not all programs set the errorlevel (exit code) correctly, so the batch file should end with an EXIT /B 0 if everything ran correctly.

L'assenza di EXIT /B 0 alla fine di un file batch di avvio è una causa comune del mancato avvio dei ruoli.A missing EXIT /B 0 at the end of a startup batch file is a common cause of roles that do not start.

Nota

Ho notato che a volte i file batch nidificati si bloccano se si usa il parametro /B.I've noticed that nested batch files sometimes hang when using the /B parameter. È possibile garantire che non si verifichi il blocco se un altro file batch chiama il file batch corrente, ad esempio se si usa il wrapper log.You may want to make sure that this hang problem does not happen if another batch file calls your current batch file, like if you use the log wrapper. In questo caso non è possibile omettere il parametro /B.You can omit the /B parameter in this case.

Prevedere la ripetuta esecuzione delle attività di avvioExpect startup tasks to run more than once

Non tutti i ricicli dei ruoli includono un riavvio, ma tutti includono l'esecuzione di tutte le attività di avvio.Not all role recycles include a reboot, but all role recycles include running all startup tasks. Ciò significa che deve essere possibile eseguire le attività di avvio più volte tra un riavvio e l'altro senza problemi.This means that startup tasks must be able to run multiple times between reboots without any problems. Questo argomento viene discusso nella sezione precedente.This is discussed in the preceding section.

Usare le risorse di archiviazione locale per archiviare i file che dovranno essere accessibili nel ruoloUse local storage to store files that must be accessed in the role

Se si desidera copiare o creare un file durante l'attività di avvio che sia quindi accessibile al ruolo, tale file deve essere posizionato nella risorsa di archiviazione locale.If you want to copy or create a file during your startup task that is then accessible to your role, then that file must be placed in local storage. Vedere la sezione precedente.See the preceding section.

Passaggi successiviNext steps

Verificare il pacchetto e il modello del servizioReview the cloud service model and package

Altre informazioni sul funzionamento delle attività .Learn more about how Tasks work.

Creare e distribuire il pacchetto del servizio cloud.Create and deploy your cloud service package.