我試圖在Azure上運行C可執行文件。我有很多workerRoles,他們不斷檢查一個Job Queue。如果隊列中存在作業,則根據存儲在作業類中的命令行參數,工作角色將C可執行文件的實例作爲進程運行。 C可執行文件通常會創建一些日誌文件。我不知道如何訪問這些創建的文件。它背後的邏輯是什麼?創建的文件在哪裏存儲?任何人都可以解釋我?我是新來的azure和C#。在Azure上運行本機代碼
另一個問題是C可執行文件的所有工作實例都需要讀取數據文件。我如何分發所需的文件?
我試圖在Azure上運行C可執行文件。我有很多workerRoles,他們不斷檢查一個Job Queue。如果隊列中存在作業,則根據存儲在作業類中的命令行參數,工作角色將C可執行文件的實例作爲進程運行。 C可執行文件通常會創建一些日誌文件。我不知道如何訪問這些創建的文件。它背後的邏輯是什麼?創建的文件在哪裏存儲?任何人都可以解釋我?我是新來的azure和C#。在Azure上運行本機代碼
另一個問題是C可執行文件的所有工作實例都需要讀取數據文件。我如何分發所需的文件?
首先,意識到在Windows Azure中,您的輔助角色只是在Windows 2008 Server環境(SP2或R2)中運行。當你部署你的應用程序時,你也可以部署你的C可執行文件(或者從blob存儲中獲取它,但這有點高級)。要找出您的應用在磁盤上的位置,請撥打Environment.GetEnvironmentVariable("RoleRoot")
- 返回路徑。通常,您的應用程序位於角色根下的名爲AppRoot的文件夾中。你會在那裏找到你的C可執行文件。
接下來,您會希望您的應用將其文件寫入您在命令行中指定的輸出目錄。您可以使用角色的屬性在本地虛擬機中設置存儲。看看本地存儲選項卡,並配置一個名爲本地存儲區域:
現在,你可以得到的路徑存儲區,代碼,然後將其作爲命令行參數:
var outputStorage = RoleEnvironment.GetLocalResource("MyLocalStorage");
var outputFile = Path.Combine(outputStorage.RootPath, "myoutput.txt");
var cmdline = String.Format("--output {0}", outputFile);
這裏是啓動您的Myapp.exe進程的一個例子,用命令行參數:
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();
通常你會設置CreateNoWindow爲true,BU如果您可以看到命令外殼窗口,則更容易進行調試。
最後一件事:一旦程序完成創建文件,你想要麼:
在生產中,你需要添加異常處理,你可以重新路由stdout和stderr被捕獲。但是這個示例代碼應該足以讓你開始。
OOPS - 再多一件事:將'myapp.exe'添加到您的項目時,請務必轉至其屬性,並將'複製到輸出目錄'設置爲'始終複製' - 否則您的myapp.exe文件不會在Windows Azure中結束,您會想知道爲什麼事情不起作用。
編輯:推結果一個blob - 一個簡單的例子
首先得到建立一個存儲帳戶,並添加到您的角色的設置。假設你把它稱爲「AzureStorage」 - 現在設置它在代碼中,得到一個blob容器的引用,得到該容器內的BLOB的引用,然後執行文件上傳到BLOB:
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);
在Azure中,您不應寫入文件系統。您可以寫信給SQL Azure中,表存儲或最有可能在這種情況下,Blob存儲(基本上,我想你應該覺得Blob存儲的舊文件系統)
這是因爲:
你可能有多個實例正在運行,並且最終會在不同的實例上擁有不同的文件(這只是虛擬機)
您的實例可能隨時被移動,並且您將丟失文件系統上的信息,因爲它不是部署包的一部分。
使用三種存儲選項之一將爲您的所有實例提供一箇中央存儲庫以供訪問,並且它將在重新部署之後持續存在。
這不是真的。您有兩個非持久和耐用的文件存儲器可供寫入。有關更多詳細信息,請參閱我的答案(一會兒)。 – 2011-05-06 19:53:25
耐用的文件存儲 - 是blob存儲? – 2011-05-06 19:57:13
是的 - 在大約10行代碼中,您可以將NTFS卷裝載爲雲端硬盤。看起來像一個驅動器到您的應用程序的信。 – 2011-05-06 20:11:14
謝謝。你能解釋我如何從本地存儲收集創建的文件嗎?每個工人可以將創建的文件複製到一個blob。那麼其他一些工作者角色或客戶端應用程序可以達到該blob的權利? – 2011-05-06 20:38:25
有關將輸出文件推送到Blob的快速示例,請參閱更新的答案。同樣,您需要異常處理等。我建議下載Windows Azure平臺培訓套件以獲取更多詳細信息 - 優秀教程和實踐操作實驗。 – 2011-05-06 21:01:42
這是一個很好的答案,我從這個主題中學到了很多東西。但我目前面臨的一個問題是獲取創建的輸出文件。在大衛的迴應中,假設有一個「輸出」標誌來指定輸出文件。如果沒有國旗怎麼辦?還有一種使用process.standardoutput的替代方法也可以將輸出作爲流獲取,但如果可能的話,我更喜歡使用命令輸出重定向運算符「>」,「>>」等。所以問題是:**是使用cmd運算符可能嗎?**感謝您的額外信息。 – alien052002 2011-05-27 16:57:17