2011-05-06 16 views
11

Estoy intentando ejecutar un ejecutable C en Azure. Tengo muchos workerRoles y comprueban continuamente una cola de trabajos. Si hay un trabajo en la cola, un rol de trabajador ejecuta una instancia del ejecutable C como un proceso de acuerdo con los argumentos de línea de comando almacenados en una clase de trabajo. El ejecutable C crea algunos archivos de registro normalmente. No sé cómo acceder a esos archivos creados. ¿Cuál es la lógica detrás de esto? ¿Dónde están almacenados los archivos creados? ¿Alguien puede explicarme? Soy nuevo en azul y C#.Ejecutando código nativo en Azure

Otro problema es que todas las instancias de trabajo del ejecutable C necesitan leer un archivo de datos. ¿Cómo puedo distribuir ese archivo requerido?

Respuesta

8

Primero, tenga en cuenta que en Windows Azure, su función de trabajador simplemente se ejecuta dentro de un entorno de Windows 2008 Server (SP2 o R2). Cuando implemente su aplicación, también desplegará su ejecutable C (o lo tomará del almacenamiento de blobs, pero eso es un poco más avanzado). Para saber dónde vive su aplicación en el disco, llame al Environment.GetEnvironmentVariable("RoleRoot"), que devuelve una ruta. Por lo general, tendrías tu aplicación en una carpeta llamada AppRoot debajo de la raíz del rol. Encontrarías tu ejecutable C allí.

A continuación, querrá que su aplicación escriba sus archivos en el directorio de salida que especifique en la línea de comandos. Puede configurar el almacenamiento en su máquina virtual local con las propiedades de su función. Mira la ficha Almacenamiento local, y configurar un área de almacenamiento local llamado:

enter image description here

Ahora puede obtener la ruta de acceso a la zona de almacenamiento, en el código, y pasarlo como argumento de línea de comandos:

var outputStorage = RoleEnvironment.GetLocalResource("MyLocalStorage"); 
var outputFile = Path.Combine(outputStorage.RootPath, "myoutput.txt"); 
var cmdline = String.Format("--output {0}", outputFile); 

He aquí un ejemplo de poner en marcha su proceso de myapp.exe, con argumentos de línea de comando:

var appRoot = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") 
      + @"\", @"approot"); 

var myProcess = new Process() 
{ 
    StartInfo = new ProcessStartInfo(Path.Combine(appRoot, @"myapp.exe"), cmdline) 
    { 
     CreateNoWindow = false, 
     UseShellExecute = false, 
     WorkingDirectory = appRoot 
    } 
}; 
myProcess.WaitForExit(); 

Normalmente lo haces con CreateNoWindow true, bu t es más fácil de depurar si puede ver la ventana del shell de comandos.

Lo último: Una vez que su aplicación se lleva a cabo la creación del archivo, usted querrá ya sea:

  • procesarlo y eliminarlo (que no está en un lugar duradero por lo que finalmente va a desaparecer)
  • Cambie su almacenamiento de utilizar una unidad de nube (almacenamiento duradero)
  • Copie su archivo en una burbuja (almacenamiento duradero)

En la producción, tendrá que añadir control de excepciones, y puede volver a ruta stdout y stderr para ser capturado. Pero este código de muestra debería ser suficiente para comenzar.

OOPS - una más 'una cosa más': cuando agregue su 'myapp.exe' a su proyecto, asegúrese de ir a sus Propiedades, y establezca 'Copiar en el directorio de salida' a 'Copiar siempre' - de lo contrario su El archivo myapp.exe no terminará en Windows Azure y se preguntará por qué las cosas no funcionan.

EDIT: Empujar los resultados a un blob - un ejemplo rápido

En primer lugar ponerse en marcha una cuenta de almacenamiento y añadir a la configuración del papel. Digamos que llamó 'AzureStorage' - ahora configurarlo en el código, obtener una referencia a un contenedor de blob, obtener una referencia a una burbuja dentro de ese recipiente, y luego realizar una carga de archivos a la burbuja:

 CloudStorageAccount storageAccount = CloudStorageAccount.FromConfigurationSetting("AzureStorage"); 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
     CloudBlobContainer outputfiles = blobClient.GetContainerReference("outputfiles"); 
     outputfiles.CreateIfNotExist(); 

     var blobname = "myoutput.txt"; 
     var blob = outputfiles.GetBlobReference(blobname); 
     blob.UploadFile(outputFile); 
+0

Gracias. ¿También puede explicarme cómo recopilar los archivos creados desde el almacenamiento local? Cada trabajador puede copiar el archivo creado a un blob. Entonces, algún otro rol de trabajador o una aplicación de cliente puede alcanzar ese bloque, ¿verdad? –

+0

Consulte la respuesta actualizada para ver un ejemplo rápido de cómo empujar el archivo de salida a un blob. De nuevo, necesitará manejo de excepciones, etc. Recomiendo descargar el Kit de capacitación de la plataforma Windows Azure para obtener más detalles: excelentes tutoriales y laboratorios prácticos allí. –

+0

esta es una gran respuesta y aprendí mucho de este hilo; pero el único problema al que me enfrento actualmente es crear el archivo de salida. en la respuesta de David, se supone que un indicador "--output" para especificar el archivo de salida. ¿Qué pasa si no hay una bandera? hay una alternativa de usar process.standardoutput también para obtener la salida como una secuencia, pero prefiero usar los operadores de redirección de salida del comando ">", ">>", etc., si es posible. entonces la pregunta es: ** ¿está usando el operador de cmd? ** gracias por la información adicional. – alien052002

2

En Azure land no debe escribir en el sistema de archivos. Usted debe escribir en SQL Azure, almacenamiento de tablas o más probable en este caso el almacenamiento Blob (básicamente, creo que se debe pensar en el almacenamiento blob como el sistema de archivos de edad)

Esto se debe a:

  1. usted podría tener varias instancias en ejecución y terminará teniendo diferentes archivos en diferentes instancias (que son solo máquinas virtuales)

  2. Su instancia podría ser movida en cualquier momento y perdería la información en el sistema de archivos, ya que no es parte de su paquete de implementación.

Utilizando una de las tres opciones de almacenamiento proporcionará un repositorio central para todas sus instancias para acceder y se persistido a través de una redistribución.

+0

Eso es no es verdad Tiene un almacenamiento de archivos duradero y no duradero para escribir. Ver mi respuesta (en un momento) para más detalles. –

+0

almacenamiento duradero de archivos: ¿ese es el almacenamiento de blob? –

+0

Sí, en aproximadamente 10 líneas de código, puede montar un volumen NTFS como Cloud Drive. Se parece a una letra de unidad de tu aplicación. –

Cuestiones relacionadas