我正在尝试设置运行可执行文件的Function App。我正在使用http触发功能,首先需要在特定位置上传一些文件,然后运行exe。
我从Blob存储中抓取了几个小文件,并将它们放在。\ wwwroot \ ExternalFiles文件夹中。然后,我有2个较大的文件,包括exe(〜50MB),该文件进入另一个文件夹。\ wwwroot \ Sim。
所有文件都放置到位后,我将运行exe。
我尝试了不同的组合和位置,但是exe无法正常运行或根本无法运行。奇怪的是,有时应用程序在传输最后两个文件时会卡住。它们实际上已转移,但实时终端日志不再通信。过了一会儿,它的错误代码为500。
这是我的代码(在我的本地环境中可以正常工作):
var containerName = "simulationfiles";
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=.....");
CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
// ExternalFiles
CloudBlob blob = container.GetBlobReference("Aeromap_AEM.aem");
await blob.DownloadToFileAsync(@"D:\home\site\wwwroot\ExternalFiles\Aeromap_AEM.aem", FileMode.OpenOrCreate);
log.LogInformation("Aeromap_AEM.aem copied to ExternalFiles folder");
blob = container.GetBlobReference("BiasVsPlungerForce.txt");
await blob.DownloadToFileAsync(@"D:\home\site\wwwroot\ExternalFiles\BiasVsPlungerForce.txt", FileMode.OpenOrCreate);
log.LogInformation("BiasVsPlungerForce.txt copied to ExternalFiles folder");
blob = container.GetBlobReference("EngineFile.eng");
await blob.DownloadToFileAsync(@"D:\home\site\wwwroot\ExternalFiles\EngineFile.eng", FileMode.OpenOrCreate);
log.LogInformation("EngineFile.eng copied to ExternalFiles folder");
[...several more files...13 files in total]
// ModelFiles
blob = container.GetBlobReference("dsin.txt");
await blob.DownloadToFileAsync(@"D:\home\site\wwwroot\Sim\dsin.txt", FileMode.OpenOrCreate);
log.LogInformation("dsin.txt copied to ExternalFiles folder");
blob = container.GetBlobReference("SetupExperiment.temp");
await blob.DownloadToFileAsync(@"D:\home\site\wwwroot\Sim\SetupExperiment.temp", FileMode.OpenOrCreate);
log.LogInformation("SetupExperiment.exe copied to ExternalFiles folder");
System.IO.File.Move(@"D:\home\site\wwwroot\Sim\SetupExperiment.temp", @"D:\home\site\wwwroot\Sim\SetupExperiment.exe");
// Run the model
int modelTimeout = 1000;
double modelProcessTime;
bool modelTimedout = false;
Directory.SetCurrentDirectory(@"D:\home\site\wwwroot\Sim");
Process p = new Process();
p.StartInfo.FileName = @"D:\home\site\wwwroot\Sim\SetupExperiment.exe";
p.StartInfo.Arguments = @"D:\home\site\wwwroot\Sim\dsin.txt D:\home\site\wwwroot\Sim\SetupExperimentResults.mat";
p.StartInfo.WorkingDirectory = @"D:\home\site\wwwroot\Sim";
p.Start();
Thread.Sleep(2000); //allows the process to be created
modelProcessTime = p.TotalProcessorTime.TotalSeconds;
Thread.Sleep(1000);
while (!modelTimedout)
{
// Check if the process is done (processtime doesn't increase anylonger
if (modelProcessTime == p.TotalProcessorTime.TotalSeconds)
{
modelTimedout = true; // model done running
}
modelProcessTime = p.TotalProcessorTime.TotalSeconds; // update process time
log.LogInformation( System.Convert.ToString(modelProcessTime) );
if (modelProcessTime > modelTimeout)
{
p.Kill();
modelTimedout = true;
}
Thread.Sleep(2000);
}
整个代码在try / catch中,但是我没有任何错误日志。 正如我提到的,在应用程序失败后,我从浏览器中返回了终端,所有文件都被复制了,因此它们已被成功复制。我真的不确定发生了什么,甚至不确定如何调试它。
代码中有明显的错误吗? 任何建议都很棒。 PS:这里是真正的新手,所以不要对我的代码太笑了:)
更新1
我刚刚从Kudu中的cmd运行了exe,它可以正常工作。因此,看来这不是exe问题。也许与存储和超时有关?或是权限...只是在黑暗中拍摄