Visual C ++ 2012ランタイムライブラリセットアップファイル を追加したMVC4ロールを持つAzureプロジェクトと、それをサイレントインストールするためのスクリプトがあります。
スクリプトが機能し、ライブラリがインストールされます。唯一の問題は、タスクが終了せず、インストールプロセスが終了しないことです。これにより、ロールの開始がブロックされます。
リモートデスクトップを使用してサーバーに接続しました。タスクマネージャーを見ると、プロセスvcredist_x64.exeがわかります:(実際には2つですが、これは正常だと思います)
プロセスを右クリックして強制終了すると、展開が正常に終了し、役割が開始されます。
これは、ServiceDefinition.csdefで起動タスクがsimpleに設定されている場合に問題になります。これにより、タスクが終了して役割を開始するまでサーバーが待機するためです。そのため、タスクをバックグラウンドに設定して、起動スクリプトが役割の開始をブロックしないようにしましたが、それでもプロセスはバックグラウンドで実行されているため、手動で強制終了する必要があります。
このスクリプトは機能するはずであり、以前は2010 VC ++ライブラリを使用していました(ただし、EXITはありませんが、スクリプトがエラーコードを返した場合に役割がブロックされないようにするために存在する必要があります)。
vcredist_x64.exe /quiet /norestart
EXIT /B 0
動作しなかったので、インストール後に手動でプロセスを強制終了すると思いました。
vcredist_x64.exe /quiet /norestart
TASKKILL /F /T /IM vcredist_x64.exe
EXIT /B 0
動作しませんでした、プロセスはまだ生きていました。スクリプトは、サーバー上で手動で実行した場合、またはローカルで実行した場合に実際に機能しますが、Azureが展開中に実行しようとすると、ハングします。
私のスタートアップタスクは、ServiceDefinition.csdefで次のように定義されています。
<Startup>
<Task commandLine="InstallVcRedist.cmd" executionContext="elevated" taskType="background" />
</Startup>
ログインはC:\Resources\temp\{RoleId.RoleName}\RoleTemp
すべてがうまくいったと言っています。
startup-taskを単純ではなくバックグラウンドに設定することで役割がブロックされないようにすることはできますが、それでも問題は解決しません。ありがとう。