エクスポート (0) 印刷
すべて展開

スタートアップ タスクのベスト プラクティス

更新日: 2013年11月

スタートアップ タスクではグローバル属性を設定する

スタートアップ タスクは、IIS が完全に開始および構成される前に実行されるため、サイト、ロール、またはインスタンスの属性を構成するのには適していません。スタートアップ タスクには、グローバル属性を構成する方が適しています。

サイト、ロール、およびインスタンス特有の属性は、Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart メソッドで設定してください。

スタートアップ アクティビティのログを常に作成する

Visual Studio にはバッチ ファイルをステップ実行できるデバッガーがないため、バッチ ファイルの操作についてできるだけ多くのデータを取得することをお勧めします。バッチ ファイルの出力である stdoutstderr の両方についてログを作成しておくと、バッチ ファイルをデバッグして修正するときに重要な情報が得られます。stdout および stderr の両方を TEMP 環境変数によって示されるディレクトリにある StartupLog.txt に記録するには、記録する特定の行の末尾に >> "%TEMP%\StartupLog.txt" 2>&1 というテキストを追加します。たとえば、%PathToApp1Install% ディレクトリの setup.exe を実行する場合は、次のようになります。

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

各行の末尾に >> "%TEMP%\StartupLog.txt" 2>&1 を追加しないでスタートアップ タスクの出力をすべて記録するには、スタートアップ バッチ ファイルが 2 つ必要です。最初のバッチ ファイルは、2 番目のバッチ ファイルを呼び出して、リダイレクトにより 2 番目のバッチ ファイルのアクティビティをすべて記録します。これは、適切なリダイレクトを実行するために必要です。

次の例で、スタートアップ バッチ ファイルの出力をすべてリダイレクトする方法を示します。この例では、ServerDefinition.csdef ファイルで Startup1.cmd を呼び出すスタートアップ タスクを作成します。Startup1.cmd は Startup2.cmd を呼び出して、%TEMP%\StartupLog.txt にすべての出力をリダイレクトします。

ServiceDefinition.cmd:

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

Startup1.cmd:

REM   Startup1.cmd calls the main startup batch file, Startup2.cmd, redirecting all output 
REM   to the StartupLog.txt log file.

REM   Log the startup date and time.
ECHO Startup1.cmd: >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Current date and time: >> "%TEMP%\StartupLog.txt" 2>&1
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Starting up Startup2.cmd. >> "%TEMP%\StartupLog.txt" 2>&1

REM   Call the Startup2.cmd batch file, redirecting all output to the StartupLog.txt log file.
START /B /WAIT Startup2.cmd >> "%TEMP%\StartupLog.txt" 2>&1

REM   Log the completion of Startup1.cmd.
ECHO Returned to Startup1.cmd. >> "%TEMP%\StartupLog.txt" 2>&1

IF ERRORLEVEL EQU 0 (
   REM   No errors occurred. Exit Startup1.cmd normally.
   EXIT /B 0
) ELSE (
   REM   Log the error.
   ECHO An error occurred. The ERRORLEVEL = %ERRORLEVEL%.  >> "%TEMP%\StartupLog.txt" 2>&1
   EXIT %ERRORLEVEL%
)

Startup2.cmd:

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.
EXIT /B %ERRORLEVEL%

スタートアップ タスクの executionContext を適切に設定する

スタートアップ タスクの特権を適切に設定します。ときには、ロールは通常の特権で実行しているのに、スタートアップ タスクは高度な特権で実行しなくてはいけない場合があります。

executionContext 属性は、スタートアップ タスクの特権レベルを設定します。executionContext="limited" を指定すると、スタートアップ タスクがロールと同じ特権レベルになります。executionContext="elevated" を指定すると、スタートアップ タスクが管理者特権を持ち、ロールに管理者特権を与えずにスタートアップ タスクが管理者のタスクを実行できます。

高度な特権を必要とするスタートアップ タスクの例としては、AppCmd.exe を使用して IIS を構成するスタートアップ タスクがあります。AppCmd.exe は、Task 要素で executionContext="elevated" を指定する必要があります。

次の例では、スタートアップ タスクの ConfigureIISSettings.cmd に高度な特権を設定しています。

    <Startup>
      <Task commandLine="ConfigureIISSettings.cmd" executionContext="elevated" taskType="simple" />
    </Startup>

適切な taskType を使用する

taskType 属性によって、スタートアップ タスクの実行方法が決まります。taskType の値は、simplebackgroundforeground の 3 つです。バックグラウンド タスクとフォアグラウンド タスクは非同期的に開始され、単純タスクは 1 つずつ同期的に実行されます。

simple スタートアップ タスクを使用すると、ServiceDefinition.csdef ファイルに記載した順序によって、タスクの実行順序を設定できます。simple タスクがゼロ以外の終了コードで終了した場合、スタートアップ手続きが停止し、ロールは開始されません。

background スタートアップ タスクと foreground スタートアップ タスクの違いは、foreground タスクの場合、foreground タスクの実行が終了するまでロールが実行され続けることです。これは、foreground タスクがハングまたはクラッシュした場合、foreground タスクが強制終了されるまで、ロールが再利用されないことも意味します。そのため、非同期スタートアップ タスクでは、foreground タスクの機能が必要でない限り、background タスクを使うことをお勧めします。

バッチ ファイルを EXIT /B 0 で終了する

ロールは、単純スタートアップ タスクそれぞれの errorlevel がゼロの場合にのみ開始されます。すべてのプログラムが errorlevel (終了コード) を正しく設定しているわけではないため、バッチ ファイルは EXIT /B 0 コマンドで終了する必要があります。

スタートアップ バッチ ファイルの末尾に EXIT /B 0 がないことが、ロールを開始できない一般的な原因です。

スタートアップ タスクは複数回実行されると想定する

ロールの再利用には必ず再起動が伴うわけではありませんが、ロールの再利用時には必ずすべてのスタートアップ タスクが実行されます。つまり、スタートアップ タスクは再起動までに複数回実行できる必要があるということです。詳細については、「複数回実行できるスタートアップ タスクを作成する方法」を参照してください。

ロールでアクセスする必要のあるファイルはローカル ストレージに格納する

ロールがアクセスできるファイルをスタートアップ タスク内でコピーまたは作成する場合は、そのファイルをローカル ストレージに配置する必要があります。スタートアップ タスクとロールのためにローカル ストレージを作成して使用する方法の詳細については、「起動時におけるローカル ストレージへのファイルの格納」を参照してください。

参照

表示:
© 2015 Microsoft